| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- <?xml version="1.0" encoding="utf-8"?>
- <!-- EN-Revision: 15617 -->
- <!-- Reviewed: no -->
- <sect1 id="zend.cache.introduction">
- <title>Introduction</title>
- <para>
- <classname>Zend_Cache</classname> fournit un moyen générique de mettre en cache des
- données.
- </para>
- <para>
- Le cache dans Zend Framework est réalisé via les frontends alors que les caches
- d'enregistrements sont stockés grâce à des adaptateurs de backend (<code>File</code>,
- <code>Sqlite</code>, <code>Memcache</code>...) grâce à un système souple d'ID et de
- balises. En les utilisant, il est simple de supprimer des types spécifiques
- d'enregistrements par la suite (par exemple: "supprime tous les enregistrements de cache
- marqués avec une balise donnée").
- </para>
- <para>
- Le coeur du module (<classname>Zend_Cache_Core</classname>) est générique, souple et
- configurable. Pour le moment, pour vos besoins spécifiques, il y a des frontends qui
- étendent <classname>Zend_Cache_Core</classname> simplement : <code>Output</code>,
- <code>File</code>, <code>Function</code> et <code>Class</code>.
- </para>
- <example id="zend.cache.introduction.example-1">
- <title>Créer un frontend avec Zend_Cache::factory()</title>
- <para>
- <classname>Zend_Cache::factory()</classname> instancie les objets corrects et les lie
- ensemble. Dans le premier exemple, nous allons utiliser le frontend <code>Core</code>
- avec le backend <code>File</code>.
- </para>
- <programlisting language="php"><![CDATA[
- $frontendOptions = array(
- 'lifetime' => 7200, // temps de vie du cache de 2 heures
- 'automatic_serialization' => true
- );
- $backendOptions = array(
- // Répertoire où stocker les fichiers de cache
- 'cache_dir' => './tmp/'
- );
- // créer un objet Zend_Cache_Core
- $cache = Zend_Cache::factory('Core',
- 'File',
- $frontendOptions,
- $backendOptions);
- ]]></programlisting>
- </example>
- <note>
- <title>Frontends et Backends constitués de plusieurs mots</title>
- <para>
- Certains frontends et backends sont nommés en utilisant plusieurs mots, comme
- "<code>ZendPlatform</code>". En les spécifiant à la fabrique, séparez les en utilisant
- un séparateur de mot, comme l'espace (" "), le tiret ("-") ou le point (".").
- </para>
- </note>
- <example id="zend.cache.introduction.example-2">
- <title>Mettre en cache un résultat de requête sur une base de données</title>
- <para>
- Maintenant que nous avons un frontend, nous pouvons mettre en cache tout type de
- données (nous avons activé la sérialisation). Par exemple nous pouvons mettre en cache
- le résultat d'une requête SQL coûteuse. Après qu'il soit mis en cache, il n'y a plus
- besoin de se connecter à la base de données. Les enregistrements récupérés depuis le
- cache sont désérialisés.
- </para>
- <programlisting language="php"><![CDATA[
- // $cache initialisé dans l'exemple précédent
- // on regarde si un cache existe déjà
- if(!$result = $cache->load('myresult')) {
- // le cache est manquant, connexion à la base de données
- $db = Zend_Db::factory( [...] );
- $result = $db->fetchAll('SELECT * FROM grosse_table');
- $cache->save($result, 'myresult');
- } else {
- // il y a un cache
- echo "Ceci est issu du cache !\n\n";
- }
- print_r($result);
- ]]></programlisting>
- </example>
- <example id="zend.cache.introduction.example-3">
- <title>Cache de sortie avec le frontend de sortie Zend_Cache</title>
- <para>
- Nous marquons les sections dans lesquelles nous voulons un cache de sortie en
- ajoutant de la logique conditionnelle, en encapsulant la section entre les méthodes
- <code>start()</code> et <code>end()</code> (cela ressemble au premier exemple et est le
- coeur de la stratégie de mise en cache).
- </para>
- <para>
- A l'intérieur, affichez vos données comme d'habitude toutes les sorties seront
- misent en cache quand la méthode <code>end()</code> est appelée. A la prochaine
- exécution, la section complète sera évitée, au profit de la récupération de son cache
- (si le cache est encore valide).
- </para>
- <programlisting language="php"><![CDATA[
- $frontendOptions = array(
- // temps de vue du cache de 30 secondes
- 'lifetime' => 30,
- // par défaut
- 'automatic_serialization' => false
- );
- $backendOptions = array('cache_dir' => './tmp/');
- $cache = Zend_Cache::factory('Output',
- 'File',
- $frontendOptions,
- $backendOptions);
- // nous passons un identifiant unique de la méthode start()
- if(!$cache->start('mypage')) {
- // affichage
- echo 'Hello world! ';
- echo 'Ceci est issu du cache('.time().') ';
- // la sortie est sauvegardée est envoyé au navigateur
- $cache->end();
- }
- echo "Ceci n' jamais mis en cache (" . time() . ").";
- ]]></programlisting>
- <para>
- Notez que nous affichons le résultat de <code>time()</code> deux fois ; c'est
- dans un but de démonstration. Essayez de lancer la page et de la rafraîchir plusieurs
- fois ; vous allez constater que le premier nombre ne change pas alors que le second
- change à chaque actualisation. C'est parce que le premier nombre a été mis en cache et
- sauvegardé. Après 30 secondes ("<code>lifeTime</code>" a été mis à 30 secondes), le
- premier nombre devrait de nouveau correspondre au second nombre parce que le cache a
- expiré -- seulement pour être mis en cache de nouveau. Vous devriez essayer ce code
- dans votre navigateur ou dans une console.
- </para>
- </example>
- <note>
- <para>
- Lorsque vous utilisez <classname>Zend_Cache</classname>, faîtes attention à
- l'identifiant du cache (passé à <code>save()</code> et <code>start()</code>). Il doit
- être unique pour chaque ressource que vous mettez en cache, sinon il est possible que
- des caches en efface d'autres, ou encore pire, s'affiche en lieu et place d'autres.
- </para>
- </note>
- </sect1>
|