Chapitre 3. Zend_Cache

Table des matières

3.1. Introduction
3.2. La th�orie du cache
3.2.1. La m�thode de fabrique de Zend_Cache
3.2.2. Marquer les enregistrements
3.2.3. Nettoyer le cache
3.3. frontends Zend_Cache
3.3.1. Zend_Cache_Core
3.3.2. Zend_Cache_Frontend_Output
3.3.3. Zend_Cache_Frontend_Function
3.3.4. Zend_Cache_Frontend_Class
3.3.5. Zend_Cache_Frontend_File
3.3.6. Zend_Cache_Frontend_Page
3.4. Zend_Cache backends
3.4.1. Zend_Cache_Backend_File
3.4.2. Zend_Cache_Backend_Sqlite
3.4.3. Zend_Cache_Backend_Memcached
3.4.4. Zend_Cache_Backend_APC

3.1. Introduction

Zend_Cache founit un moyen g�n�rique des mettre en cache des donn�es.

Le cache dans le Framework Zend op�re via frontends alors que les caches d'enregistrements sont stock�s gr�ce � des adapteurs de backend (File, Sqlite, Memcache...) � travers un syst�me souple d'IDs 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 enregistrement de cache marqu� avec une balise donn�e")

Le coeur du module (Zend_Cache_Core) est g�n�rique, souple et configurable. Pour le moment, pour vos besoins sp�cifiques, il y a des frontends qui �tendent Zend_Cache_Core. pour votre confort : Output, File, Function and Class.

Exemple 3.1. Cr�er un frontend avec Zend_Cache::factory()

Zend_Cache::factory() instancie les objets corrects et les lie ensemble. Dans le premier exemple, nous allons utiliser le frontend Core avec le backend File

<?php
require_once 'Zend/Cache.php';

$frontendOptions = array(
   'lifeTime' => 7200, // temps de vie du cache de 2 heures
   'automaticSerialization' => true
);

$backendOptions = array(
    'cacheDir' => './tmp/' // R�pertoire o� stocker les fichiers de cache
);

// cr�er un objet Zend_Cache_Code
$cache = Zend_Cache::factory('Core', 'File', $frontendOptions, $backendOptions);

?>

Maintenant que nous avons un frontend, nous pouvons mettre en cache tout type de donn�es. Nous avons activ� la serialisation. Par exemple nous pouvons mettre en cache le r�sultat d'une requ�te SQL couteuse. Apr�s qu'il soit mis en cache, il n'y a plus besoin de se connecter � la base de donn�es. Les enregistrement r�cup�r� depuis le cache sont d�s�rialis�s.

<?php

// $cache initialis� dans l'exemple pr�c�dent

// on regarde si un cache existe d�j�
if(!$result = $cache->get('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 "This one is from cache!\n\n";

}

print_r($result);

?>

Exemple 3.2. Cache de sortie avec le frontend de sortie Zend_Cache

Nous marquons les sections dans lesquelles nous voulons une cache de sortie en ajoutant de la logique conditionnelle, en encapsulant la section entre les m�thodes start() et end() (cela ressemble au premier exemple et est la core strategy de pour la mise en cache)

A l'int�reieur, affichez vous donn�es comme d'habitude toutes les sorties seront misent en cache quans la m�thode end() est appel�e. A la prochaine ex�cution, la section compl�te sera pass�e, au profit de la r�cup�ration de son cache (si le cache est encore valide).

<?php

$frontendOptions = array(
   'lifeTime' => 30,                  // temps de vue du cache de 30 secondes
   'automaticSerialization' => false  // par d�faut
);

$backendOptions = array('cacheDir' => './tmp/');

$cache = Zend_Cache::factory('Output', 'File', $frontendOptions, $backendOptions);

// nous passons un identifiant unique � la m�thode start()
if(!$cache->start('mypage')) {
    // output as usual:

    echo 'Hello world! ';
    echo 'Ceci est dy cache('.time().') ';

    $cache->end(); // la sortie est sauvegard�e est envoy� au navigateur
}

echo 'Ceci n\' jamais mis en cache ('.time().').';

?>       

Notez que nous affichons le r�sultat de time() deux fois; c'est dans un but de d�monstrations. Essayez de lancer la page est de la rafraichir plusieurs fois; you allez constater que la premier nombre ne change pas alors que le second change � chaque actualisation. C'est parce que le premier nombre a �t� mis en cache est sauvegard�. Apr�s 30 secondes, le nombre devrait de nouveau correspondre au second nombre parce que le cache a espir� -- seulement pour �tre cach� de nouveau. Vous devriez essayer �a dans votre navigateur ou dans une console.

[Note] Note

Lorsque vous utilisez Zend_Cache, faite attention � l'identifiant du cache (pass� � save() et start()). 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.