4.3. frontends Zend_Cache
Précédent | Chapitre 4. Zend_Cache | Suivant

## 4.3. frontends Zend_Cache

### 4.3.1. Zend_Cache_Core

#### 4.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
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.

#### 4.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 4.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.

#### 4.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);

    ?>

### 4.3.2. Zend_Cache_Frontend_Output

#### 4.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()` .

#### 4.3.2.2. Options disponibles

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

#### 4.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.

### 4.3.3. Zend_Cache_Frontend_Function

#### 4.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.

#### 4.3.3.2. Options disponibles

Tableau 4.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

#### 4.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
Vous pouvez passer n'importe quelle fonction utilisateur � l'exception de `array()`, `echo()`, `empty()`, `eval()`, `exit()`, `isset()`, `list()`, `print()` et `unset()`.

### 4.3.4. Zend_Cache_Frontend_Class

#### 4.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.

#### 4.3.4.2. Options disponibles

Tableau 4.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

#### 4.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');

    ?>

### 4.3.5. Zend_Cache_Frontend_File

#### 4.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�.

#### 4.3.5.2. Options disponibles

Tableau 4.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

#### 4.3.5.3. Exemples

L'utilisation de ce frontend est la m�me que celle de`Zend_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.

### 4.3.6. Zend_Cache_Frontend_Page

#### 4.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
Zend_Cache_Frontend_Page est vraiment en version alpha, et est pr�vue d'�tre am�lior� plus tard.

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

Tableau 4.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.

#### 4.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)

    ?>

Précédent | Niveau supérieur | Suivant
4.2. La th�orie du cache | Sommaire | 4.4. Zend_Cache backends