Blog

Varnish et le balisage ESI : une gestion avancée du cache des blocs

12.12.2014
esi

L’ESI (Edge Side Includes) est un balisage supporté par Varnish. Cela permet de cacher des blocs avec différents temps de vie (=TTL).

Par exemple, la page suivante dispose de différents blocs dont la plupart peuvent être mis en cache. Cependant, le bloc “Welcome” ou “Shopping cart” va lui être bien spécifique à chaque utilisateur et ne doit donc pas être mis en cache.

L’intérêt d’ESI est donc permettre une gestion du cache différentiel par bloc. Des TTL spécifiques à chaque bloc vont pouvoir être défini.

Un première exemple

Afin de bien comprendre le fonctionnement des balises ESI, prenons un exemple tout simple.

Notre fichier index.php : 

<?php
        header('Cache-Control: max-age=3600');
?>
<title>Page de test ESI</title>
<html><body>
        Cette page est cachée pourtant j‘arrive à afficher l‘heure :
        <esi:include src="//date.php"/>
</body></html>
</pre>

Notre fichier date.php :

<?php
        header('Cache-Control: max-age=0');
        echo date('Y-m-d H:i:s');
?>

Pour que les balises ESI soit interprété par Vanish, il faut ajouter la configuration suivante dans le default.vcl : 

sub vcl_fetch {
        set beresp.do_esi = true;
}

Cet exemple nous montre que même si la page est mise en cache, l’heure affichée sera toujours la bonne. Cette partie dans le bloc ESI n’est donc pas mis en cache.

Intégration de ESI au sein de Drupal

Avant tout, il faut avoir Varnish installé sur son serveur. Pour cela, vous pouvez suivre notre tutoriel : 

Pour que Varnish puisse interpréter correctement le balisage ESI, il faut modifier le default.vcl. Nous avons externalisé le paramétrage ESI dans un fichier particulier : esi_blocks.vcl

Les 2 fichiers sont en téléchargement :

 
Ensuite, il faut télécharger et activer le module Drupal : Edge Side Includes integration

Maintenant, lorsque vous éditez les paramètres d’un bloc, vous avez une section dédiée à ESI 

En activant ESI, le bloc ne sera donc pas mis en cache et sera généré à chaque chargement de page.

Pour aller plus loin

Par défaut, le TTL paramétré dans l’édition du bloc n’est pas pris en compte. En effet, vous pouvez renseigner n’importe quelle valeur, le bloc sera toujours regénéré.

Ce problème survient car le comportement natif de Drupal est de ne pas mettre en cache les blocs. Pour modifier ce comportement, il faut ajouter le module Block Cache Alter. Si vous souhaitez définir un TTL pour un bloc, il faut donc mettre le paramètre suivant dans l’édition du bloc :

Un projet ? Parlons-en

Nous sommes à votre écoute pour étudier vos besoins
et vous proposer les meilleures solutions.

Autres articles

Drupal est l'un des systèmes de gestion de contenu (CMS) les plus robustes et flexibles disponibles aujourd'hui. Cependant, à mesure que le trafic augmente, vous pouvez rencontrer des problèmes de performance. C'est là qu'intervient Redis, une base de données en mémoire, de type clé-valeur, extrêmement rapide. Dans cet article, nous explorerons comment intégrer Redis dans Drupal pour améliorer les performances et la scalabilité de votre site.