Aller au contenu

phil/http-cache-tags-bundle

alpha

Mettez des pages entières en cache dans Varnish ou un CDN, et purgez exactement celles qu'une modification change.

phil/http-cache-tags-bundle étiquette les réponses d'une application Symfony pour le cache HTTP placé devant elle. Une réponse recueille des étiquettes pendant son rendu : depuis le #[CacheTag] d'un contrôleur, le cache_tag() d'un gabarit ou ResponseTags dans le code. Les étiquettes sont écrites dans l'en-tête que lit le cache : xkey pour Varnish, Cache-Tag pour Cloudflare, Surrogate-Key pour Fastly. Quand une entité change lors d'un flush de Doctrine, ou quand l'application le demande, ses étiquettes sont purgées à la fin de la requête ou de la commande. Le bundle purge Varnish et Cloudflare ; pour Fastly, il écrit seulement l'en-tête. Il ne fixe pas la durée de mise en cache d'une réponse : l'en-tête Cache-Control reste celui de l'application.

Il s'adresse à un site qui sert la plupart de ses pages depuis un cache et veut qu'une modification s'affiche tout de suite, sans tout purger. Une page étiquetée page:42 et menu quitte le cache quand cette page ou le menu change, et seulement à ce moment. Les étiquettes d'un fragment atteignent la page dont il fait partie : un bloc intégré est donc purgé avec chaque page qui l'affiche.

Le bundle se branche sur le noyau HTTP de Symfony pour écrire l'en-tête et pour purger après l'envoi de la réponse. Doctrine ORM, Twig et le client HTTP de Symfony sont facultatifs, pour l'invalidation au flush, cache_tag() et les purgeurs. Deux ports portent la conception : un CacheTagResolver nomme les étiquettes des réponses qui affichent une entité, et un CacheTagPurger envoie la purge à un cache.

État

PartieÉtat
CacheTag, ResponseTags, l'en-tête sur la réponse principaleImplémenté et testé
#[CacheTag] avec des paramètres de route ; cache_tag() dans TwigImplémenté et testé
Invalidator, CacheTagResolver, l'invalidation à chaque flush, la purge à la finImplémenté et testé
VarnishPurger (xkey), CloudflarePurgerImplémenté et testé

Documentation

DocumentContenu
InstallationLes prérequis, l'enregistrement, la configuration.
ÉtiquetageL'attribut, la fonction Twig, le service, l'en-tête.
PurgeLes résolveurs, le flush, la fin d'une requête, Varnish et Cloudflare.
Points d'extensionCe qu'une application implémente, configure, remplace ou utilise.
TestsLa façon dont le bundle est testé.
RéférenceChaque type du bundle.

Démarrage rapide

#[CacheTag('page:{id}', 'menu')]
public function show(string $id): Response { /* … */ }
{{ cache_tag('product:' ~ product.id) }}
$invalidator->invalidate('menu');   // purged when the request ends

Prérequis

PHP 8.5 ou plus récent ; les composants DependencyInjection, Config et HttpKernel de Symfony 8.2. Doctrine ORM, le client HTTP de Symfony et Twig sont facultatifs.

Contribuer

Les contributions sont les bienvenues sur le monodépôt PHIL : lisez le guide de contribution et le code de conduite. Signalez une vulnérabilité en privé, comme l'explique la politique de sécurité, jamais dans un ticket public.

Licence

MIT, © Philippe Gamache, doing business as Le Gnome Archiviste; a Parler Haut Interagir Librement project. Voir LICENSE.