Disabilitare la cache in PHP
La cache è un componente fondamentale del protocollo HTTP in quanto consente di ottimizzare le performance della navigazione web. In pratica, mediante l'uso della cache HTTP, il browser "viene invitato" (o meno) ad utilizzare copie locali di alcuni elementi remoti al fine di restituire, in modo più veloce ed efficente, talune risorse remote visitate in precedenza.
In poche parole quando visitiamo una pagina web il nostro browser (a seconda di una serie di fattori) memorizza alcuni elementi della pagina (come ad esempio le immagini, i fogli di stile, gli script, ecc.) in modo tale da non doverli scaricare nuovamente nel momento in cui l'utente tornerà su quella stessa pagina web.
Come funziona la cache HTTP?
Le "istruzioni" circa l'utilizzo della cache vengono ricevute dal browser all'interno dello scambio di informazioni col server che restituisce la risorsa remota: attraverso il protocollo HTTP, infatti, il client ed il server "discutono" di varie cose tra cui, appunto, la gestione della cache (in assenza di istruzioni esplicite la cache verrà governata in base alle impostazioni settate nel browser dell'utente).
Quando viene richiesta una pagina presente in cache, infatti, il browser invia una richiesta HTTP al server chiedendo se il file è stato modificato (if-modified-since) dalla data in cui l'ha scaricato e salvato in locale. A questo punto il server può rispondere con:
- 304 Not Modified
Il file non è stato modificato, quindi può essere utilizzata la versione salvata in cache; - 200 OK
Il file è stato modificato ed è necessario scaricarlo nuovamente.
Disabilitare la cache
Se è vero che il meccanismo di caching risulta essere molto importate per una comunicazione efficiente, è altrettanto verò che in talune circostanze ciò può creare dei problemi: si pensi, ad esempio, ad una pagina dinamica che cambia continuamente il suo contenuto. Cosa succederebbe se questa venisse salvata in cache e ripresentata all'utente sempre uguale?
Una simile situazione può capitare quando lo scambio di informazioni di cui abbiamo parlato poco sopra, per qualche motivo, non funziona a dovere. Per questo, in talune circostanze, può essere utile disabilitare la cache al fine di escludere che una data risorsa venga memorizzata in locale nel computer client.
Se state sviluppando in PHP potete ovviare al problema mediante la funzione header() per inviare alcuni settaggi espliciti relativamente alla gestione della cache all'interno delle intestazioni HTTP.
Il campo header di HTTP supporta due informazioni molto importanti in tal senso: Expires e Last-Modified: il primo comunica al browser una data di scadenza della risorsa, mentre il secondo è utilizzato per esplicitare la data di ultima modifica dei contenuti.
Oltre a questi possono essere inviati i parametri Cache-Control (HTTP/1.1) e Pragma (HTTP/1.0) per inviare al browser una richiesta esplicita di non salvare la risorsa nella cache.
Vediamo un esempio completo di header PHP per disabilitare la cache:
header("Expires: on, 01 Jan 1970 00:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
Inviando questi header (prima della generazione dell'output, ovviamente) il client non salverà la pagina PHP in cache e, ad ogni richiesta, la scaricherà nuovamente dal server.