Cache max-age
Cache max-age = tijdsafhankelijke afhankelijkheden
Cache max-age is vergelijkbaar met de HTTP-directive max-age van de Cache-Control header.
Waarom?
Cache max-age biedt een declaratieve manier om tijdsafhankelijke caches te maken.
Sommige gegevens zijn slechts gedurende een beperkte periode geldig, en in dat geval wil je een overeenkomstige maximale leeftijd opgeven. In het geval van Drupal 8 core hebben we echter geen gegevens die slechts tijdelijk geldig zijn; we cachen meestal permanent (zie hieronder) en vertrouwen volledig op cache tags voor invalidatie.
Wat?
Cache max-age is een positief geheel getal dat het aantal seconden uitdrukt.
Cache max-age wordt doorgegeven als een enkel geheel getal, omdat een bepaald cache-item logisch gezien slechts één maximale leeftijd kan hebben.
Voorbeelden:
- 60 betekent cachen gedurende 60 seconden
- 100 betekent cachen gedurende 100 seconden
- 0 betekent cachen voor nul seconden, d.w.z. helemaal niet cachen
- \Drupal\Core\Cache\Cache::PERMANENT betekent dat het voor altijd gecachet wordt, dus enkel ooit ongeldig gemaakt door cache tags. (Met andere woorden: ∞ of oneindig aantal seconden.)
Dus, als je bijvoorbeeld wilt voorkomen dat een gerenderd blok wordt gecachet, moet je max-age = 0 instellen.
Voorbeeld voor de meeste render arrays:
$build['#cache']['max-age'] = 0;
Voorbeeld in een functie:
\Drupal::cache()->set('my_cache_item', $school_list, REQUEST_TIME + (86400));
Als je de max-age van een blok op 0 wilt zetten, moet je de methode getCacheMaxAge implementeren.
Beperkingen van max-age
Helaas werkt max-age niet voor anonieme gebruikers en de Page Cache module van Drupal core. Zie bijvoorbeeld deze issues:
- #2352009: [pp-3] Forward max-age van items naar page headers en page cache
- #2449749: Voeg #cache['downstream-ttl'] toe om verval na bepaalde tijd af te dwingen en fix de logica van #cache['max-age'] door #cache['age'] toe te voegen
- #2835068: PageCache cachet niet-cachebare responses (schendt HTTP/1.0-specificaties) + D8 schakelt bewust HTTP/1.0 proxies uit = WTF
- #2951814: Stel altijd X-Drupal-Cache en X-Drupal-Dynamic-Cache headers in, zelfs voor responses die niet gecachet worden
Totdat deze (en mogelijk andere) problemen zijn opgelost, moet je er rekening mee houden dat het instellen van een max-age voor een render array die in een pagina is opgenomen, onvoldoende is om anonieme gebruikers een nieuwe versie te laten zien nadat de max-age verlopen is. Ondertussen probeert de contrib module Cache Control Override de problemen te verhelpen. Je zou ook geluk kunnen hebben door een eigen cache tag in te stellen op pagina’s met tijdsafhankelijke inhoud en deze tags handmatig ongeldig te maken via hook_cron(). Succes!