Dcycle Blog

Comment ça marche Purge sur Drupal

December 17, 2024

Drupal Purge est un module qui permet à Drupal d’informer des couches de cache en aval (externes) que des contenus ont changé.

Par exemple, vous avez une page, /node/1.

Cette page est ensuite mise en cache dans un système en aval via Akamai, ou Cloudflare, ou Varnish.

Si vous configurez votre cache externe pour garder /node/1 en cache pour un an (TTL de 31536000 secondes), mais que vous changez /node/1 avant un an, Drupal peut utiliser le module Purge pour informer votre couche de cache que la cache de /node/1 doit être invalidée.

Nous pouvons tester ça sur un système local de la façon suivante.

Étape 1: installer Purge et certaines modules de test

Sur un tout nouveau site Drupal, installez et activez ces modules:

composer require drupal/purge drupal/purge_purger_http
drush en -y purge_ui purge_purger_http purge_queuer_coretags
  • Purge est le module de base qui ne fait rien seul.
  • Generic HTTP Purger est un module qui ne fait qu’envoyer une requête à une adresse web. Puisque nous testons le module de façon local, en principe nous n’avons pas besoin d’un compte Akamai ou Cloudflare ou autre. Nous voulons simplement démontrer comment ce module fonctionne, mais pas l’utiliser pour vrai.

Étape 2: créer une route qui garde en mémoire une requête entrante

Au lieu de faire affaire avec une cache externe, pour le moment nous allons créer un simple script PHP qui peut recevoir une commande de Purge.

Par exemple, vous pourriez créer un document php temporaire au:

/var/www/html/test-requete.php

Ce document pourrait contenir:

<?php
file_put_contents(
  '/var/www/html/sites/default/files/purger-log.json',
  json_encode([
    getallheaders(),
    time(),
  ]) . PHP_EOL,
  FILE_APPEND,
);

Étape 3: tester votre script

Connectez-vous au conteneur Docker ou au serveur Drupal et assurez-vous de pouvoir accéder à /test-requete.php. Par exemple si votre site est accessible de l’intérieur de votre serveur avec http://localhost, assurez-vous d’accéder à http://localhost/test-requete.php.

curl --header "test: test" http://localhost/test-requete.php

Il devrait maintenant être possible de voir la requête:

cat sites/default/files/purger-log.json
[{"Test":"test","Accept":"*\/*","User-Agent":"curl\/8.11.0","Host":"webserver","Content-Length":"","Content-Type":""},1734707768]

Étape 4: configurer Purge

  • Vous rendre à /admin/config/development/performance/purge
  • Cliquer sur “Add purger”
  • Choisir HTTP Purger
  • Configurer votre Purger
    • Name: test
    • Hostname: le nom du host (par exemple localhost)
    • Path: /test-requete.php
    • Dans Headers, ajouter un header “invalidate” avec la valeur [invalidation:expression]
  • Enregister votre purger

Sur drush, ajouter un processeur:

drush p:processor-add drush_purge_queue_work
# [OK] The processor has been
# added!

Étape 5: ajouter une page

  • /node/add/page
  • title: test 1
  • sauvegarder

Étape 6: modifiez votre page

  • /node/1/edit
  • title: test 2
  • sauvegarder

Étape 7: rouler la commande Drush de Purge

drush cron n’a aucun effet sur Purge! Il faut rouler cette commande:

drush p-queue-work

Vous verrez quelque chose comme:

------------------------ ---
 Succeeded                3
 Failed                   0
 Currently invalidating   0
 Not supported            0
------------------------ ---

Étape 8: confirmer que votre script a bien reçu la commande de Purge

cat sites/default/files/purger-log.json
...
[{"Invalidate":"node_list","User-Agent":"purge_purger_http module for Drupal 8.","Host":"webserver","Content-Length":"","Content-Type":""},1734707886]
[{"Invalidate":"node_list:page","User-Agent":"purge_purger_http module for Drupal 8.","Host":"webserver","Content-Length":"","Content-Type":""},1734707886]
[{"Invalidate":"node:1","User-Agent":"purge_purger_http module for Drupal 8.","Host":"webserver","Content-Length":"","Content-Type":""},1734707886]

Ici, ce qu’on voit, c’est que les tags node:1, node_list:page, et node_list ont été invalidés.

Concrètement, ça veut dire que toutes les pages (URLs) qui sont identifiés d’un de ces tags verront leurs cache invalidée, par exemple:

  • /node/1 (bien sûr!)
  • Une page qui contient un bloc avec des pages reliées, taggé avec “node_list:page”
  • Une liste de tout le contenu, taggé avec “node_list”

Par exemple, si vous aviez une page au /node/2 qui avait un bloc qui contient des pages reliées au node 2, et que le titre de la /node/1 s’y trouve, alors là le node 2 serait invalidé aussi.

C’est pour cela que le fait d’invalider les caches externes par URL (par exemple: dire à Cloudflare d’invalider le chemin /node/1) n’est pas assez puissant! Car le titre de la page 1 pourrait se trouver sur des centaines d’autres pages à travers le site, et sans tags, il n’y a aucune façon d’invalider tout ça à la fois!

Prochaines étapes

Le module purge_purger_http n’est qu’un exemple pour tester Purge. Dans votre projet, vous allez utiliser, probablement, un des nombreux modules qui existent pour connecter Purge avec Cloudflare, Akamai, ou autre.

Ressources

La vidéo d’une heure D8 Caching With Purge, Varnish, And CloudFlare!, de Bay Area Drupal Camp, le 25 octobre, 2016, m’a donné les pièces manquantes du puzzle pour faire fonctionner Purge.