Cache max-age
Cache max-age = dipendenza dal tempo
Cache max-age è simile alla direttiva HTTP max-age dell’intestazione Cache-Control.
Perché?
Il valore massimo di vita della cache fornisce un modo dichiarativo per creare cache che dipendono dal tempo.
Alcuni dati sono validi solo per un periodo di tempo limitato, in questo caso si desidera specificare l’età massima corrispondente. Tuttavia, nel core di Drupal 8 non abbiamo dati validi solo per un periodo limitato; di solito memorizziamo nella cache in modo permanente (vedi sotto) e ci affidiamo completamente ai tag di cache per l’invalidazione.
Cosa?
Il valore massimo di vita della cache è un numero intero positivo che rappresenta il numero di secondi.
Il max-age viene passato come un singolo intero, poiché un dato elemento della cache può logicamente avere solo un’età massima.
Esempi:
- 60 significa cache per 60 secondi
- 100 significa cache per 100 secondi
- 0 significa cache per zero secondi, cioè non viene memorizzato
- \Drupal\Core\Cache\Cache::PERMANENT significa che viene memorizzato per sempre, cioè verrà invalidato solo a causa dei tag di cache. (In altre parole: ∞ o infiniti secondi.)
Quindi, se per esempio vuoi impedire il caching di un blocco renderizzato, devi impostare max-age = 0.
Esempio per la maggior parte degli array di rendering:
$build['#cache']['max-age'] = 0;
Esempio in una funzione:
\Drupal::cache()->set('my_cache_item', $school_list, REQUEST_TIME + (86400));
Se vuoi modificare il max-age di un blocco a 0, devi implementare il metodo getCacheMaxAge.
Limitazioni del max-age
Sfortunatamente, max-age non funziona per gli utenti anonimi e il modulo Page Cache del core di Drupal. Per esempio, vedi questi problemi:
- #2352009: [pp-3] Propagare il max-age degli elementi nelle intestazioni della pagina e della cache della pagina
- #2449749: Aggiungere #cache['downstream-ttl'] per forzare la scadenza dopo un certo tempo e correggere la logica di #cache['max-age'], aggiungendo #cache['age']
- #2835068: PageCache memorizza risposte non cacheabili (violando le specifiche HTTP/1.0) + D8 disabilita intenzionalmente i proxy HTTP/1.0 = WTF
- #2951814: Impostare sempre le intestazioni X-Drupal-Cache e X-Drupal-Dynamic-Cache, anche per risposte non cacheabili
Finché questi (e forse altri) problemi non saranno risolti, tieni presente che impostare il max-age su un array di rendering incluso in una pagina non è sufficiente affinché gli utenti anonimi vedano una nuova versione dopo la scadenza del max-age. Nel frattempo, il modulo Cache Control Override cerca di mitigare i problemi. Potresti anche avere fortuna impostando un tag di cache personalizzato su pagine con contenuti dipendenti dal tempo, e invalidando questi tag manualmente con hook_cron(). Buona fortuna!