2011-11-14 13 views
0

Je dois enregistrer un résultat dans le contrôleur renvoyé par le modèle. Les résultats doivent être sauvegardés de manière à ce que je puisse utiliser ces données quand le second contrôleur de temps est appelé sans appeler le modèle. Je ne veux pas mettre les données en session ou memcache. Quel devrait être le moyen le plus efficace de le faire?Variables statiques dans CodeIgniter

Répondre

1

La plupart des personnes qui ont commencé avec PHP n'appelleraient pas ces "variables statiques". Avez-vous migré de Java par hasard? C'est un peu un changement de paradigme si vous passez à l'apatridie de HTTP - memcached a été conçu pour cela (même si je ne suis pas sûr qu'APC ou d'autres caches d'opcode étaient). Les sessions basées sur les cookies étaient , un type de conçu pour cela.

Si vous essayez d'éviter les requêtes répétées sur la même demande, appuyer sur le cache de requête de CI (et le cache de requêtes de votre serveur de base de données, pour cette matière), ou d'utiliser ce que PHP appelle « variables statiques »:

class Some_model extends CI_Model { 

    protected static $some_result; 

    public function getResult() 
    { 
     if (empty(self::$some_result)) 
     { 
      self::$some_result = $this->db->get('table')->result(); 
     } 

     return self::$some_result; 
    } 
} 

Vous devrez peut-être ajuster si la requête peut éventuellement retourner vide, mais vous obtenez le point. C'est aussi un peu inutile avec les modèles, car je ne pense pas que vous pouvez créer plus d'une instance à travers le CI_Loader de toute façon ...

0

Je ne pense pas que vous ayez de meilleures options en utilisant la DB ou la Session ou vous devriez utiliser des variables d'URL (bu cela ne semble pas une bonne solution). Avez-vous déjà envisagé d'utiliser Code igniter flash data? (mais cela est également basé sur des sessions)

+0

Merci pour votre réponse. Quelle option considérez-vous préférable de stocker une grande quantité de données dans la session ou d'appeler la base de données à chaque appel? –

0

CI dispose d'un cache de requêtes intégré. Votre code appellera toujours le modèle, mais le db ne sera pas interrogé - il tirera d'un fichier dans le dossier de cache.

0

Si votre requête est générique pour tous les utilisateurs, vous pouvez utiliser le cache APC PHP natif. Donnez-lui une clé et appelez apc_add('myresult', $result);. Vous pouvez récupérer la valeur plus tard en utilisant apc_fetch('myresult');. S'il s'agit d'une grande quantité de données, vous pouvez soit la rechercher à nouveau dans la base de données, soit la mettre en cache en utilisant une combinaison de session, système de fichiers, apc, cache de requête CI ou memcached. Pourquoi l'aversion à la session ou memcached? Je suis confus comment vous vous attendez à "enregistrer" des données, mais ne voulez pas utiliser deux techniques vraiment bonnes pour le faire.