Maison  >  Article  >  développement back-end  >  Yii Framework Official Guide Series 30 - Mise en cache : mise en cache des fragments

Yii Framework Official Guide Series 30 - Mise en cache : mise en cache des fragments

黄舟
黄舟original
2017-02-15 09:16:021003parcourir



La mise en cache de fragments fait référence à la mise en cache d'un certain fragment d'une page Web. Par exemple, si une page affiche des résumés de ventes annuelles dans un tableau, nous pouvons stocker ce tableau dans le cache, réduisant ainsi le temps nécessaire à sa régénération à chaque demande.

Pour utiliser la mise en cache des fragments, appelez CController::beginCache() et CController::endCache() dans le script de vue du contrôleur. Les deux méthodes commencent et se terminent en incluant le contenu de la page qui sera mis en cache. Semblable à la mise en cache des données, nous avons besoin d’un numéro pour identifier le fragment mis en cache.


...别的HTML内容...
<?php if($this->beginCache($id)) { ?>
...被缓存的内容...
<?php $this->endCache(); } ?>
...别的HTML内容...

Dans ce qui précède, si BeginCache() renvoie false, le contenu mis en cache sera automatiquement inséré à ce moment-là. place; Sinon, le contenu de l'instruction if sera exécuté et mis en cache lorsque endCache() sera déclenché.

1. Options de mise en cache

Lors de l'appel debeginCache(), vous pouvez fournir un tableau composé d'options de mise en cache comme deuxième paramètre pour personnaliser le cache de fragments. En fait, pour plus de commodité, les méthodes beginCache() et endCache() sont des wrappers du widget [COutputCache]. Par conséquent, toutes les propriétés de COutputCache peuvent être initialisées dans les options de cache.

Durée

L'option la plus courante est peut-être la durée, qui spécifie la durée pendant laquelle le contenu sera valide dans le cache. Il est similaire au paramètre d’expiration CCache::set(). Le code suivant met en cache les extraits de contenu pendant une heure maximum :


...其他HTML内容...
<?php if($this->beginCache($id, array('duration'=>3600))) { ?>
...被缓存的内容...
<?php $this->endCache(); } ?>
...其他HTML内容...

Si nous ne définissons pas de période , la valeur par défaut est 60, ce qui signifie que le contenu mis en cache sera invalide après 60 secondes.

Dépendance

Comme la mise en cache des données, les fragments de contenu peuvent également avoir des dépendances lorsqu'ils sont mis en cache. Par exemple, le contenu d'un article est affiché selon que l'article a été modifié ou non.

Pour spécifier une dépendance, nous créons l'option de dépendance, qui peut être un objet qui implémente ICacheDependency ou un tableau de configuration qui peut être utilisé pour générer des objets de dépendance. Le code suivant précise que le contenu du fragment dépend du changement de la valeur de la colonne lastModified :


...其他HTML内容...
<?php if($this->beginCache($id, array('dependency'=>array(
        'class'=>'system.caching.dependencies.CDbCacheDependency',
        'sql'=>'SELECT MAX(lastModified) FROM Post')))) { ?>
...被缓存的内容...
<?php $this->endCache(); } ?>
...其他HTML内容...

Variation )

Le contenu mis en cache peut changer selon certains paramètres. Par exemple, le profil de chacun est différent. Le contenu du profil mis en cache changera en fonction de l'ID de chaque personne. Cela signifie qu'un identifiant différent sera utilisé lors de l'appel debeginCache().

COutputCache intègre cette fonctionnalité et les programmeurs n'ont pas besoin d'écrire des modèles qui modifient le contenu en fonction de l'ID. Ci-dessous un résumé.

  • varyByRoute : définissez cette option sur true et le contenu mis en cache changera en fonction de l'itinéraire. Par conséquent, chaque combinaison de contrôleur et d’action aura un contenu mis en cache distinct.

  • varyBySession : définissez cette option sur true et le contenu mis en cache changera en fonction de l'ID de session. Par conséquent, chaque session utilisateur peut voir un contenu différent servi par le cache.

  • varyByParam : Définissez le nom dans le tableau de cette option. Le contenu mis en cache changera en fonction de la valeur du paramètre GET. Par exemple, si une page affiche le contenu d'un article en fonction du paramètre id GET, nous pouvons spécifier varieByParam comme array('id') pour nous permettre de mettre en cache le contenu de chaque article. Sans de tels changements, nous ne pourrions mettre en cache qu’un certain article.

  • varyByExpression : en définissant cette option sur une expression PHP, on peut faire varier le contenu mis en cache en fonction du résultat de cette expression PHP. Cette option est disponible depuis la version 1.0. 4.

Type de demande

Parfois, nous souhaitons que la mise en cache des fragments soit activée uniquement pour certains types de demandes. Par exemple, pour qu'un formulaire soit affiché sur une certaine page Web, nous souhaitons uniquement mettre en cache le formulaire initialement demandé (via une requête GET). Tout formulaire affiché ultérieurement (via une requête POST) ne sera pas mis en cache, car le formulaire peut contenir des entrées utilisateur. Pour ce faire, nous pouvons spécifier l'option requestTypes :


...其他HTML内容...
<?php if($this->beginCache($id, array('requestTypes'=>array('GET')))) { ?>
...被缓存的内容...
<?php $this->endCache(); } ?>
...其他HTML内容...

2. Nested Caching )

Les caches de fragments peuvent être imbriqués. Autrement dit, un fragment de cache est attaché à un cache de fragments plus grand. Par exemple, les commentaires sont mis en cache dans le cache d'extraits de code interne et ils sont mis en cache ensemble dans le cache externe avec le contenu de l'article.


...其他HTML内容...
<?php if($this->beginCache($id1)) { ?>
...外部被缓存内容...
    <?php if($this->beginCache($id2)) { ?>
    ...内部被缓存内容...
    <?php $this->endCache(); } ?>
...外部被缓存内容...
<?php $this->endCache(); } ?>
...其他HTML内容...

Le cache imbriqué peut définir différentes options de cache. Par exemple, dans l'exemple ci-dessus, le cache interne et le cache externe peuvent être définis sur des valeurs de durée différentes. Lorsque les données stockées dans le cache externe sont invalidées, le cache interne peut toujours servir des fragments internes valides. Cependant, l’inverse n’est pas vrai. Si le cache externe contient des données valides, il conservera une copie en cache pour toujours, même si le contenu du cache interne a expiré.

Ce qui précède est le contenu de la série 30 du guide officiel du Yii Framework - Mise en cache : mise en cache des fragments. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn