<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect1 id="zend.cache.theory">
    <title>Aspect théorique</title>

    <para>
        Il y a trois concepts clés dans <classname>Zend_Cache</classname>. Le premier est
        l'identifiant unique (une chaîne) qui est utilisé pour identifier les enregistrements de
        cache. Le second est la directive <emphasis>"lifeTime"</emphasis> vue dans les
        exemples&#160;; elle définit combien de temps la ressource de cache est considérée comme à
        jour. Le troisième est l'exécution conditionnelle, ainsi chaque partie de votre code peut
        être évitée entièrement, pour améliorer les performances. La fonction principale du
        frontend (<methodname>Zend_Cache_Core::get()</methodname>) est toujours faite pour retourner
        <constant>FALSE</constant> en cas de cache manquant, si cela donne du sens à la nature d'un
        frontend. Cela permet aux utilisateurs d'entourer des parties de code qu'ils veulent mettre
        en cache (et éviter) dans une instruction
        <emphasis><methodname>if()</methodname>{ ... }</emphasis> où la condition est une
        méthode <classname>Zend_Cache</classname>. A la fin de ces blocs, vous devez sauvegarder ce
        que vous avez généré (par exemple <methodname>Zend_Cache_Core::save()</methodname>).
    </para>

    <note>
        <para>
            Le design de l'exécution conditionnelle de votre code généré n'est pas forcément
            dans des frontends (<emphasis>Function</emphasis>, par exemple) quand toute la logique
            est implémentée à l'intérieur du frontend.
        </para>
    </note>

    <note>
        <para>
            Le "Cache hit" est un terme pour une condition quand l'enregistrement de cache
            est trouvé, valide, et à jour (en d'autres mots, qu'il n'a pas encore expiré). Le
            "Cache miss" est tout le reste. Lorsque un "Cache miss" survient, vous devez générer
            vos données (comme vous le feriez normalement) et les mettre en cache. Lorsque vous
            avez un "Cache hit", le backend récupère pour vous et de façon transparente, les
            enregistrements.
        </para>
    </note>

    <sect2 id="zend.cache.factory">
        <title>La méthode de fabrique de Zend_Cache</title>

        <para>
            Une bonne manière de construire une instance utilisable d'un frontend
            <classname>Zend_Cache</classname> est donnée dans l'exemple suivant&#160;:
        </para>

        <programlisting language="php"><![CDATA[
// Nous choisissons un backend (par exemple 'File' ou 'Sqlite')
$backendName = '[...]';

// Nous choisissons un frontend (par exemple: 'Core', 'Output',
// 'Page'...)
$frontendName = '[...]';

// Nous définissons un tableau d'options pour le frontend choisit
$frontendOptions = array([...]);

// Nous définissons un tableau d'options pour le banckend choisit
$backendOptions = array([...]);

// Nous créons la bonne instance
// Bien sur, les deux derniers arguments sont optionnels
$cache = Zend_Cache::factory($frontendName,
                             $backendName,
                             $frontendOptions,
                             $backendOptions);
]]></programlisting>

        <para>
            Dans les exemples suivants, nous nous assurerons que la variable
            <varname>$cache</varname> utilise une instance de frontend valide, et que vous
            comprenez comment passer des paramètres à vos backends.
        </para>

        <note>
            <para>
                Utilisez toujours <methodname>Zend_Cache::factory()</methodname> pour obtenir des
                instances de frontend. Instancier des frontends et des backends par vous-même ne
                fonctionnera pas comme prévu.
            </para>
        </note>
    </sect2>

    <sect2 id="zend.cache.tags">
        <title>Baliser les enregistrements</title>

        <para>
            Les balises sont un moyen de catégoriser les enregistrements de cache. Quand vous
            sauvegardez un cache avec la méthode <methodname>save()</methodname> vous pouvez
            définir un tableau de balises qui s'appliqueront à cet enregistrement. Ensuite vous
            serez en mesure de nettoyer tous les enregistrements de cache identifiés par
            une balise (ou plusieurs) donnée&#160;:
        </para>

        <programlisting language="php"><![CDATA[
$cache->save($grande_donnees,
             'monIDUnique',
             array('tagA', 'tagB', 'tagC'));
]]></programlisting>

        <note>
            <para>
                Notez que la méthode <methodname>save()</methodname> accepte un quatrième paramètre
                optionnel : <varname>$specificLifetime</varname> (si différent de
                <constant>FALSE</constant>, il affecte un "lifeTime" spécifique pour
                cet enregistrement de cache particulier).
            </para>
        </note>
    </sect2>

    <sect2 id="zend.cache.clean">
        <title>Nettoyer le cache</title>

        <para>
            Pour supprimer&#160;/&#160;invalider un identifiant de cache particulier, vous pouvez
            utiliser la méthode <methodname>remove()</methodname>&#160;:
        </para>

        <programlisting language="php"><![CDATA[
$cache->remove('idAEffacer');
]]></programlisting>

        <para>
            Pour effacer&#160;/&#160;invalider plusieurs identifiants de caches en une seule
            opération, vous pouvez utiliser la méthode <methodname>clean()</methodname>. Par
            exemple, pour supprimer tous les caches&#160;:
        </para>

        <programlisting language="php"><![CDATA[
// nettoie tous les enregistrements
$cache->clean(Zend_Cache::CLEANING_MODE_ALL);

// nettoie uniquement les caches obsolètes
$cache->clean(Zend_Cache::CLEANING_MODE_OLD);
]]></programlisting>

        <para>
            Si vous voulez effacer les caches correspondant aux balises "tagA" et "tagC"&#160;:
        </para>

        <programlisting language="php"><![CDATA[
$cache->clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,
              array('tagA', 'tagC'));
]]></programlisting>

        <para>
            Si vous voulez effacer les caches ne correspondant pas aux balises "tagA" et
            "tagC"&#160;:
        </para>

        <programlisting language="php"><![CDATA[
$cache->clean(Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG,
              array('tagA', 'tagC'));
]]></programlisting>

        <para>
            Si vous voulez effacer les caches correspondant aux balises "tagA" ou "tagC"&#160;:
        </para>

        <programlisting language="php"><![CDATA[
$cache->clean(Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG,
              array('tagA', 'tagC'));
]]></programlisting>

        <para>
            Les modes disponibles de nettoyage sont <constant>CLEANING_MODE_ALL</constant>,
            <constant>CLEANING_MODE_OLD</constant>, <constant>CLEANING_MODE_MATCHING_TAG</constant>,
            <constant>CLEANING_MODE_NOT_MATCHING_TAG</constant> et
            <constant>CLEANING_MODE_MATCHING_ANY_TAG</constant>. Les derniers, comme leur nom
            l'indique, sont à combiner avec un tableau de balises pour réaliser les opérations de
            nettoyage.
        </para>
    </sect2>
</sect1>
