Cache max-age
Cache max-age = dépendances temporelles
Cache max-age est analogue à la directive HTTP max-age dans l’en-tête Cache-Control.
Pourquoi ?
Le max-age du cache fournit un moyen déclaratif de créer des caches dépendants du temps.
Certaines données ne sont valides que pour une période limitée ; dans ce cas, vous souhaitez spécifier un âge maximal approprié. Cependant, dans le cas du noyau Drupal 8, nous n’avons pas de données qui ne sont valides que pour une période limitée ; nous mettons généralement en cache de façon permanente (voir ci-dessous) et nous comptons entièrement sur les tags de cache pour l’invalidation.
Quel âge ?
Le max-age du cache est un entier positif qui exprime un nombre de secondes.
Le max-age du cache est fourni sous forme d’entier individuel, car un élément de cache ne peut logiquement avoir qu’un seul âge maximal.
Exemples :
- 60 signifie une mise en cache pendant 60 secondes
- 100 signifie une mise en cache pendant 100 secondes
- 0 signifie une mise en cache pendant zéro seconde, c’est-à-dire pas de mise en cache
- \Drupal\Core\Cache\Cache::PERMANENT signifie que le cache est permanent, c’est-à-dire qu’il ne sera invalidé que par les tags de cache. (En d’autres termes : ∞ ou un nombre infini de secondes.)
Donc, si vous souhaitez empêcher la mise en cache d’un bloc rendu, vous devez lui assigner max-age = 0.
Exemple pour la plupart des tableaux de rendu :
$build['#cache']['max-age'] = 0;
Exemple dans une fonction :
\Drupal::cache()->set('my_cache_item', $school_list, REQUEST_TIME + (86400));
Si vous souhaitez modifier le max-age d’un bloc à 0, vous devez implémenter la méthode getCacheMaxAge.
Limitations du max-age
Malheureusement, max-age ne fonctionne pas pour les utilisateurs anonymes et le module Page Cache du noyau Drupal. Par exemple, consultez ces problèmes :
- # 2352009 : [pp-3] Transmission du max-age des éléments aux en-têtes de la page et au cache de page
- # 2449749 : Ajouter #cache['downstream-ttl'] pour forcer l’expiration après un certain temps et corriger la logique de #cache['max-age'], ajout de #cache['age']
- # 2835068 : PageCache met en cache des réponses non cacheables (violant la spécification HTTP/1.0) + D8 désactive intentionnellement le proxy HTTP/1.0 = WTF
- # 2951814 : Toujours définir les en-têtes X-Drupal-Cache et X-Drupal-Dynamic-Cache, même pour les réponses non cacheables
Tant que ces (et possiblement d’autres) problèmes ne seront pas résolus, gardez à l’esprit que définir un max-age sur un tableau de rendu inclus dans une page n’est pas suffisant pour que les utilisateurs anonymes voient une nouvelle version après expiration du max-age. En même temps, le module fourni Cache Control Override tente d’atténuer ces problèmes. Vous pouvez aussi avoir de la chance en définissant un tag de cache personnalisé sur les pages avec un contenu dépendant du temps, puis en invalidant ces tags manuellement via hook_cron(). Bonne chance !