La mise en cache de fragments fait rĂ©fĂ©rence Ă la mise en cache de fragments de pages Web. Par exemple, si une page affiche un rĂ©sumĂ© des ventes annuelles dans un tableau, vous pouvez stocker ce tableau en cache pour Ă©liminer le temps nĂ©cessaire Ă sa gĂ©nĂ©ration Ă chacune des requĂȘtes. La mise en cache de fragments est construite au-dessus de la mise en cache de donnĂ©es.
Pour utiliser la mise en cache de fragments, utilisez la construction qui suit dans une vue:
if ($this->beginCache($id)) {
// ... générez le contenu ici ...
$this->endCache();
}
C'est à dire, insérez la logique de génération du contenu entre les appels beginCache() et
endCache(). Si le contenu est trouvé dans le cache, beginCache()
rendra le contenu en cache et retournera false (faux), ignorant la logique de génération de contenu.
Autrement, votre logique de génération de contenu sera appelée, et quand endCache() sera appelée, le contenu généré sera capturé et stocké dans le cache.
Comme pour la mise en cache de données, un $id (identifiant) unique est nécessaire pour identifier un cache de contenu.
Vous pouvez spĂ©cifier des options additionnelles sur la mise en cache de fragments en passant le tableau d'options comme second paramĂštre Ă la mĂ©thode beginCache(). En arriĂšre plan, ce tableau d'options est utilisĂ© pour configurer un composant graphique yii\widgets\FragmentCache qui met en Ćuvre la fonctionnalitĂ© rĂ©elle de mise en cache de fragments.
L'option duration (durĂ©e) est peut-ĂȘtre l'option de la mise en cache de fragments la plus couramment utilisĂ©e. Elle spĂ©cifie pour combien de secondes le contenu peut demeurer valide dans le cache. Le code qui suit met le fragment de contenu en cache pour au maximum une heure :
if ($this->beginCache($id, ['duration' => 3600])) {
// ... générez le contenu ici...
$this->endCache();
}
Si cette option n'est pas définie, la valeur utilisée par défaut est 60, ce qui veut dire que le contenu mise en cache expirera au bout de 60 secondes.
Comme pour la mise en cache de données, le fragment de contenu mis en cache peut aussi avoir des dépendances. Par exemple, le contenu d'un article affiché dépend du fait que l'article a été modifié ou pas.
Pour spécifier une dépendance, définissez l'option dependency, soit sous forme d'objet yii\caching\Dependency, soit sous forme d'un tableau de configuration pour créer un objet yii\caching\Dependency. Le code qui suit spécifie que le fragment de contenu dépend du changement de la valeur de la colonne updated_at (mis à jour le) :
$dependency = [
'class' => 'yii\caching\DbDependency',
'sql' => 'SELECT MAX(updated_at) FROM post',
];
if ($this->beginCache($id, ['dependency' => $dependency])) {
// ... générez le contenu ici ...
$this->endCache();
}
Le contenu mise en cache peut connaĂźtre quelques variations selon certains paramĂštres. Par exemple, pour une application Web prenant en charge plusieurs langues, le mĂȘme morceau de code d'une vue peut gĂ©nĂ©rer le contenu dans diffĂ©rentes langues. Par consĂ©quent, vous pouvez souhaitez que le contenu mis en cache varie selon la langue courante de l'application.
Pour spĂ©cifier des variations de mise en cache, dĂ©finissez l'option variations, qui doit ĂȘtre un tableau de valeurs scalaires, reprĂ©sentant chacune un facteur de variation particulier. Par exemple, pour que le contenu mis en cache varie selon la langue, vous pouvez utiliser le code suivant :
if ($this->beginCache($id, ['variations' => [Yii::$app->language]])) {
// ... générez le contenu ici ...
$this->endCache();
}
Parfois, vous dĂ©sirez activer la mise en cache de fragments seulement lorsque certaines conditions sont rencontrĂ©es. Par exemple, pour une page qui affiche un formulaire, vous dĂ©sirez seulement mettre le formulaire en cache lorsqu'il est initialement demandĂ© (via une requĂȘte GET). Tout affichage subsĂ©quent du formulaire (via des requĂȘtes POST) ne devrait pas ĂȘtre mise en cache car il contient des donnĂ©es entrĂ©es par l'utilisateur. Pour mettre en Ćuvre ce mĂ©canisme, vous pouvez dĂ©finir l'option enabled, comme suit :
if ($this->beginCache($id, ['enabled' => Yii::$app->request->isGet])) {
// ... générez le contenu ici ...
$this->endCache();
}
La mise en cache de fragments peut ĂȘtre imbriquĂ©e. C'est Ă dire qu'un fragment mis en cache peut ĂȘtre contenu dans un autre fragment lui aussi mis en cache. Par exemple, les commentaires sont mis en cache dans un cache de fragment interne, et sont mis en cache en mĂȘme temps et avec le contenu de l'article dans un cache de fragment externe. Le code qui suit montre comment deux caches de fragment peuvent ĂȘtre imbriquĂ©s :
if ($this->beginCache($id1)) {
// ...logique de génération du contenu ...
if ($this->beginCache($id2, $options2)) {
// ...logique de génération du contenu...
$this->endCache();
}
// ... logique de génération de contenu ...
$this->endCache();
}
DiffĂ©rentes options de mise en cache peuvent ĂȘtre dĂ©finies pour les caches imbriquĂ©s. Par exemple, les caches internes et les caches externes peuvent utiliser des valeurs de durĂ©e diffĂ©rentes. MĂȘme lorsque les donnĂ©es mises en cache dans le cache externe sont invalidĂ©es, le cache interne peut continuer Ă fournir un fragment interne valide. NĂ©anmoins, le rĂ©ciproque n'est pas vraieâŻ; si le cache externe est Ă©valuĂ© comme valide, il continue Ă fournir la mĂȘme copie mise en cache aprĂšs que le contenu du cache interne a Ă©tĂ© invalidĂ©. Par consĂ©quent, vous devez ĂȘtre prudent lors de la dĂ©finition des durĂ©es ou des dĂ©pendances des caches imbriquĂ©s, autrement des fragments internes pĂ©rimĂ©s peuvent subsister dans le fragment externe.
Lors de l'utilisation de la mise en cache de fragments, vous pouvez rencontrer une situation dans laquelle un gros fragment de contenu est relativement statique en dehors de quelques endroits particuliers. Par exemple, l'entĂȘte d'une page peut afficher le menu principal avec le nom de l'utilisateur courant. Un autre problĂšme se rencontre lorsque le contenu mis en cache, contient du code PHP qui doit ĂȘtre exĂ©cutĂ© Ă chacune des requĂȘtes (p. ex. le code pour enregistrer un paquet de ressources). Ces deux problĂšmes peuvent ĂȘtre rĂ©solus par une fonctionnalitĂ© qu'on appelle contenu dynamique.
Un contenu dynamique signifie un fragment de sortie qui ne doit jamais ĂȘtre mis en cache mĂȘme s'il est contenu dans un fragment mis en cache. Pour faire en sorte que le contenu soit dynamique en permanence, il doit ĂȘtre gĂ©nĂ©rĂ© en exĂ©cutant un code PHP Ă chaque requĂȘte, mĂȘme si le contenu l'englobant est servi Ă partir du cache.
Vous pouvez appeler la fonction yii\base\View::renderDynamic() dans un fragment mis en cache pour y insérer un contenu dynamique à l'endroit désiré, comme ceci :
if ($this->beginCache($id1)) {
// ... logique de génération de contenu ...
echo $this->renderDynamic('return Yii::$app->user->identity->name;');
// ... logique de génération de contenu ...
$this->endCache();
}
La mĂ©thode renderDynamic() accepte un morceau de code PHP en paramĂštre. La valeur retournĂ©e est traitĂ©e comme un contenu dynamique. Le mĂȘme code PHP est exĂ©cutĂ© Ă chacune des requĂȘtes, peu importe que le fragment englobant soit servi Ă partir du cache ou pas.
Found a typo, or you think this page needs improvement?
Edit it on GitHub !
Signup or Login in order to comment.