3.3. frontends Zend_Cache

3.3.1. Zend_Cache_Core

3.3.1.1. Introduction

Zend_Cache_Core est un frontend sp�cial parce qu'il est le coeur du module. C'est un frontend de cache g�n�rique et est �tendu par les autres classes.

[Note] Note

Tous les frontends h�ritent de Zend_Cache_Core ainsi les m�thodes et les options (d�crites ci-dessous) seront aussi disponibles dans les autres frontends, cependant ils ne sont pas document�s ici.

3.3.1.2. Options disponibles

Ces options sont pass�es � la m�thode de fabrique comme montr�es dans les exemples pr�c�dents.

Tableau 3.1. Otions disponibles

Option Type de donn�es Valeur par d�faut Description
caching bool�en true active / d�sactive le caching (peut-�tre tr�s utile pour les d�bogage de scripts en cache)
lifeTime int 3600 temps de vie (en secondes) du cache, si d�fini � null, le cache est valide infiniment
logging bool�en false si d�finit � true, le logging par Zend_Log est activ� (mais le syst�me sera plus lent)
writeControl bool�en true Active / d�sactive le contr�le d'�criture (le cache est lu juste apr�s l'�criture pour d�tecter des entr�es corrompues), activer writeControl va un tout petit peu ralentire l'�criture du cache, mais pas la lecture (il peut d�tecter des fichiers de cache corrompus, mais �a n'est pas un contr�le parfait).
automaticSerialization bool�en false Active / d�sactive la s�rialization automatique, il peut �tre utilis� pour enregistrer directement des donn�es qui ne sont pas des cha�nes de caract�res (mais c'est plus lent).
automaticCleaningFactor int 0 Active / d�sactive le nettoyage automatique( garbage collector): 0 signifie aucun nettoyage automatique de cache, 1 signifie un nettoyage syst�matique du cache et x > 1 signifie le nettoyage al�atoire 1 fois toute les x �critures.

3.3.1.3. Exemples

Un exemple est donn� dans le manuel, tout au d�but.

Si vous stocker uniquement des cha�nes de caract�res dans le cache (parce qu'avec l'option "automaticSerialization", il est possible de stocker des bool�ns), vous pouvez utiliser une construction plus compact comme:

<?php

// nous avons d�j� $cache

$id = 'myBigLoop'; // id de cache de "ce que l'on veut cacher"

if (!($data = $cache->get($id))) {
    // cache miss

    $data = '';
    for ($i = 0; $i < 10000; $i++) {
        $data = $data . $i;
    }

    $cache->save($data);

}

// fait quelque chose avec $data (affichage, passage ailleurs, etc, etc)

?>       

Si vous voulez cacher des blocs multiples ou des instances de donn�es, l'id�e reste la m�me:

<?php

// on s'assure que l'on utilise des identifiant uniques
$id1 = 'foo';
$id2 = 'bar';

// block 1
if (!($data = $cache->get($id1))) {
    // cache missed

    $data = '';
    for ($i=0;$i<10000;$i++) {
        $data = $data . $i;
    }

    $cache->save($data);

}
echo($data);

// �a n'est pas affect� par la mise en cache
echo('NEVER CACHED! ');

// block 2
if (!($data = $cache->get($id2))) {
    // cache missed

    $data = '';
    for ($i=0;$i<10000;$i++) {
        $data = $data . '!';
    }

    $cache->save($data);

}
echo($data);

?>       

3.3.2. Zend_Cache_Frontend_Output

3.3.2.1. Introduction

Zend_Cache_Frontend_Output est un frontend capturant la sortie. Il utilise la bufferisation de sortie de PHP pour capturer tout ce qui passe entre les m�thodes start() et end() .

3.3.2.2. Options disponibles

Ce frontend n'a pas d'options sp�cifiques autres que celles de Zend_Cache_Core.

3.3.2.3. Exemples

Un exemple est donn�e dans le manuel, tout au d�but. Le voici avec des changements mineurs:

<?php

// s'il y a un cache miss, la bufferisation de sortie est lanc�e
if(!$cache->start('mypage')):

// affiche tout comme d'habitude
echo 'Hello world! ';
echo 'This is cached ('.time().') ';

$cache->end(); // output buffering ends
endif;

echo 'This is never cached ('.time().').';

?>       

Utiliser cette forme est assez simple pour d�finir une mise de cache de sortie dans vos projets en production, avec peu de refactorisation de code.

3.3.3. Zend_Cache_Frontend_Function

3.3.3.1. Introduction

Zend_Cache_Frontend_Function met en cache les r�sultats des appels de fonction. Elle a une seule m�thode principale appel�e call() qui prend un nom de fonction et des param�tres pour l'appel dans un tableau.

3.3.3.2. Options disponibles

Tableau 3.2. Options disponibles

Option Type de donn�es Valeur par d�faut Description
cacheByDefault bool�en true si true, les appels de fonction seront mis en cache par d�faut
cachedFunctions array   les noms de fonctions seront toujours mis en cache
nonCachedFunctions array   les noms de fonctions ne doivent jamais �tre mis en cache

3.3.3.3. Exemples

Utiliser la fonction call() est le m�me qu'utiliser le code call_user_func_array() en PHP:

<?php

$cache->call('veryExpensiveFunc', $params);

# $params est dans un tableau
# par exemple, pour appeler (avec mise en cache) veryExpensiveFunc(1, 'foo', 'bar'), vous devriez utiliser
# $cache->call('veryExpensiveFunc', array(1, 'foo', 'bar'))

?>       

Zend_Cache_Frontend_Function est assez intelligente pour mettre en cache la valeur de retour de la fonction, aisi que sa sortie interne.

[Note] Note

Vous pouvez passer n'importe quelle fonction utilisateur � l'exception de array(), echo(), empty(), eval(), exit(), isset(), list(), print() et unset().

3.3.4. Zend_Cache_Frontend_Class

3.3.4.1. Introduction

Zend_Cache_Frontend_Class est diff�rent de Zend_Cache_Frontend_Function parce qu'elle permet de mettre en cache les objets et les m�thodes statiques.

3.3.4.2. Options disponibles

Tableau 3.3. Options disponibles

Option Type de donn�es Valeur par d�faut Description
cachedEntity (required) mixed   si d�finit � un nom de classe, nous allons mettre en cache une claisse abstraite et utiliser uniquement les appels statiques; si d�finis � un objet, nous allons mettre en cache les m�thodes de ces objets.
cacheByDefault bool�en true si true, les appels vont �tre cach� par d�fault
cachedMethods array   les noms des m�thodes qui seront toujours mis en cache
nonCachedMethods array   les nomes des m�thodes qui ne doivent jamais �tre misent en cache

3.3.4.3. Exemples

Par exemple, pour mettre en cache des appels statiques:

<?php

class test {

    # M�thode statique
    public static function foobar($param1, $param2) {
        echo "foobar_output($param1, $param2)";
        return "foobar_return($param1, $param2)";
    }

}

// [...]
$frontendOptions = array(
    'cachedEntity' => 'test' // Le nom de la classe
);
// [...]

# l'appel cach�
$res = $cache->foobar('1', '2');

?>           

Pour mettre en cache des appels classiques aux m�thodes:

<?php

class test {

    private $_string = 'hello !';

    public function foobar2($param1, $param2) {
        echo($this->_string);
        echo "foobar2_output($param1, $param2)";
        return "foobar2_return($param1, $param2)";
    }

}

// [...]
$frontendOptions = array(
    'cachedEntity' => new test() // Une instance de la classe
);
// [...]

# L'appel mis en cache
$res = $cache->foobar2('1', '2');

?>           

3.3.5. Zend_Cache_Frontend_File

3.3.5.1. Introduction

Zend_Cache_Frontend_File est un frontend conduit par la modification d'un "fichier ma�tre". C'est vraiment int�ressant, par exemple, dans les probl�matiques de configuration ou de templates.

Pour l'instant, vous avez un fichier de configuration XML qui est pars� par une fonction qui retourne un "objet config" (comme avec Zend_Config). Avec Zend_Cache_Frontend_File, vous pouvez stocker l'objet config dans le cache (pour �viter de parser le XML du fichier de config chaque fois) mais avec une sorte de forte d�pendance au fichier ma�tre. Ainsi si le fichier XML de config est modifi�, le cache est imm�diatement invalid�.

3.3.5.2. Options disponibles

Tableau 3.4. Options disponibles

Option Type de donn�es Valeur par d�faut Description
masterFile (mandatory) string le chemin complet et le nom du fichier ma�tre

3.3.5.3. Exemples

L'utilisation de ce frontend est la m�me que celle deZend_Cache_Core. Il n'y a pas besoin d'exemple sp�cifique - la seule chose � faire est de d�finir le masterFile lors de l'utilisation de la fabrique.

3.3.6. Zend_Cache_Frontend_Page

3.3.6.1. Introduction

Zend_Cache_Frontend_Page est comme Zend_Cache_Frontend_Output mais cr�� pour une page complete. Il est impossible d'utiliser Zend_Cache_Frontend_Page pour mettre en cacher un bloc unique.

D'un autre c�t�, la "cache id", est calcul� automatiquement avec $_SERVER['REQUEST_URI'] et (en fonction des options) $_GET, $_POST, $_SESSION, $_COOKIE, $_FILES. De plus, vous avez seulement une m�thode pour appeler (start()) parce que l'appel � end() est totalement automatique lorsque la page est termin�.

Pour le moment, �a n'est pas impl�ment� mais nous pr�voyons d'ajouter un syst�me de condition HTTP pour �conomiser de la bande passant. (le syst�me enverra une ent�te HTTP 304 Not Modified si le cache est trouv�, et si le navigateur a d�j� la bonne version).

[Note] Note

Zend_Cache_Frontend_Page est vraiment en version alpha, et est pr�vue d'�tre am�lior� plus tard.

3.3.6.2. Options disponibles (pour ce frontend dans la fabrique Zend_Cache)

Tableau 3.5. Options disponibles

Option Type de donn�es Valeur par d�faut Description
httpConditional bool�en false utilisez le syst�me httpConditionnal ou pas (pas encore impl�ment�)
debugHeader bool�en false si true, un text de d�bogage est ajout� avant chaque page de cache
defaultOptions array array(...see below...) un tableau associatif d'options par d�faut:
  • (bool�en, true par d�faut) cache : le cache est activ� si true

  • (bool�en, false par d�faut) cacheWithGetVariables : si true, le cache est toujours activ� m�me s'il y a des variables dans le tableau $_GET

  • (bool�en, false par d�faut) cacheWithPostVariables : si true, le cache est toujours activ� m�me s'il y a des variables dans le tableau $_POST

  • (bool�en, false par d�faut) cacheWithSessionVariables : si true, le cache est toujours activ� s'il y a des variables dans le tableau $_SESSION

  • (bool�en, false par d�faut) cacheWithFilesVariables : si true, le cache est toujours activ� s'il y a des variables dans le tableau $_FILES

  • (bool�en, false par d�faut) cacheWithCookieVariables : si true, le cache est toujours activ� s'il y a des variables dans le tableau $_COOKIE

  • (bool�en, true par d�faut) makeIdWithGetVariables : si true, l'identifiant du cache sera ind�pendant du contenu du tableau $_GET

  • (bool�en, true par d�faut) makeIdWithPostVariables : si true, l'identifiant du cache sera ind�pendant du contenu du tableau $_POST

  • (bool�en, true par d�faut) makeIdWithSessionVariables : si true, l'identifiant du cache sera ind�pendant du contenu du tableau $_SESSION

  • (bool�en, true par d�faut) makeIdWithFilesVariables : si true, l'identifiant du cache sera ind�pendant du contenu du tableau $_FILES

  • (bool�en, true par d�faut) makeIdWithCookieVariables : si true, l'identifiant du cache sera ind�pendant du contenu du tableau $_COOKIE

regexps array array() un tableau associatif pour d�finir les options, uniquement pour des REQUEST_URI, les cl�s sont des regex PCRE, les valeurs sont des tableaus associatifs avec des options sp�cifiques pour d�finir si les correspondances des regexs dans $_SERVER['REQUEST_URI'] (voir les options par d�faut pour la liste des options disponibles) ; si plusieurs regexs correspondent � un $_SERVER['REQUEST_URI'], seul la derni�re sera utilis�e.

3.3.6.3. Exemples

Utilisation de Zend_Cache_Frontend_Page est vraiment trivial :

<?php

// [...] // require, configuration et factory

$cache->start();
// si le cache est trouv�, le r�sultat est envoy� au navigateur et le script s'arr�te l�

// reste de la page ...

?>           

un exemple plus complexe qui montre un moyen pour obtenir une gestion centralis�e du cache dans un fichier d'amor�age (pour utiliser avec Zend_Controller par exemple)

<?php

// vous devriez �viter de mettre trop de lignes avant la section de cache
// [...] par exemple, pour des performances optimales, "require_once" ou "Zend::loadClass" devrait �tre
// [...] apr�s la section de cache

require_once 'Zend/Cache.php';

$frontendOptions = array(
   'lifeTime' => 7200,
   'debugHeader' => true, // for debuging
   'regexps' => array(
       '^/$' => array('cache' => true),         // met en cache la totalit� d'IndexController
       '^/index/' => array('cache' => true),    // met en cache la totalit� d'IndexController
       '^/article/' => array('cache' => false), // nous ne mettons pas en cache l'ArticleController...
       '^/article/view/' => array(              // ...mais nous mettons en cache l'action "view"
           'cache' => true,                     // de cet ArticleController
           'cacheWithPostVariables' => true,    // et nous mettons en cache m�me lorsqu'il y a des variables dans $_POST
           'makeIdWithPostVariables' => true,   // (mais le cache sera d�pendent du tableau $_POST)
       )
   )
);
$backendOptions = array(
    'cacheDir' => '/tmp/'
);

// obtenir un objet Zend_Cache_Frontend_Page
$cache = Zend_Cache::factory('Page', 'File', $frontendOptions, $backendOptions);

$cache->start();
// si nous trouvons un cache, le r�sultat est envoy� au navigateur, et le script s'arr�te l�

// [...] la fin du fichier de d�marrage ( ces lignes ne seront pas ex�cut�e si on trouve un cache)

?>