Il caching memorizza una copia del contenuto generato in modo che possa essere consegnato più rapidamente alle richieste successive, senza dover rigenerare tutto da zero. Per WordPress, questo significa saltare l'esecuzione PHP e le query al database per visualizzazioni di pagina ripetute. Una pagina WordPress che impiega 800 ms per essere generata da zero può essere consegnata in meno di 50 ms quando è in cache. Il caching è una delle ottimizzazioni di maggiore impatto che puoi applicare a qualsiasi sito WordPress.
I cinque tipi di caching in WordPress
Il caching in WordPress non è un'unica cosa. Esistono cinque livelli distinti, ognuno dei quali opera in un punto diverso del ciclo di richiesta. Capire cosa fa ciascun livello ti aiuta a scegliere la giusta strategia di caching per il tuo sito.
Cache del browser
La cache del browser è il primo livello e opera interamente sul dispositivo del visitatore. Quando un browser scarica un file CSS, un'immagine o un file JavaScript, ne memorizza una copia locale. Al successivo caricamento della pagina, il browser controlla se la copia in cache è ancora valida (in base ai valori degli header Cache-Control, Expires ed ETag) e salta completamente il download se lo è. Questo elimina le richieste di rete e fa sì che le visualizzazioni di pagina successive sembrino quasi istantanee per i visitatori di ritorno.
Controlli il caching del browser tramite gli header di risposta HTTP. I più importanti sono:
Cache-Control: max-age=31536000: dice al browser di memorizzare il file in cache per un anno (31.536.000 secondi). Utilizzato per asset statici con versione che ottengono un nuovo nome file quando cambiano.Cache-Control: no-cache: il browser deve verificare con il server prima di utilizzare la copia in cache. Il server può rispondere con "304 Not Modified" se il file non è cambiato, risparmiando larghezza di banda.Cache-Control: no-store: il browser non deve mai memorizzare in cache questa risposta. Utilizzato per contenuti sensibili o altamente dinamici.
Cache della pagina
Il caching della pagina è il maggior guadagno in termini di prestazioni per la maggior parte dei siti WordPress. Ecco il problema che risolve: ad ogni richiesta di pagina, WordPress carica il suo core, inizializza la connessione al database, esegue decine di query al database, elabora gli hook dei plugin e renderizza i template del tema. Questo ciclo PHP/MySQL richiede da 200 ms a diversi secondi, a seconda del tuo server e della complessità del tuo sito. Produce lo stesso output HTML per ogni visitatore anonimo.
Una cache della pagina memorizza quell'output HTML dopo la prima richiesta. Quando il visitatore successivo richiede la stessa pagina, il file HTML memorizzato in cache viene consegnato direttamente dal server web (o anche da un reverse proxy davanti ad esso), bypassando completamente WordPress, PHP e il database. La differenza è drammatica. Invece di eseguire 50-200 query al database ed eseguire migliaia di righe di PHP, il server legge semplicemente un file e lo invia.
Cache degli oggetti
La cache degli oggetti si trova tra WordPress e il database. WordPress richiede spesso ripetutamente gli stessi dati all'interno di un singolo caricamento di pagina e tra caricamenti di pagina: opzioni, metadati utente, dati post, transient. La cache degli oggetti memorizza questi risultati di query in memoria (utilizzando Redis o Memcached) in modo che non colpiscano il database ogni volta.
WordPress ha una cache degli oggetti integrata, ma per impostazione predefinita funziona solo all'interno di una singola richiesta (non persiste tra le richieste). Per il caching persistente degli oggetti hai bisogno di un plugin drop-in che colleghi WordPress a Redis o Memcached. Le opzioni più popolari sono Redis Object Cache e Object Cache Pro.
Il caching degli oggetti è particolarmente prezioso per i siti che non possono utilizzare il caching completo delle pagine, come i negozi WooCommerce con contenuti personalizzati, i siti di abbonamento o i forum dove il contenuto cambia frequentemente.
Cache opcode (OPcache)
Ogni volta che PHP elabora uno script, prima compila il codice PHP leggibile dall'uomo in bytecode (istruzioni leggibili dalla macchina). Questo passaggio di compilazione viene ripetuto ad ogni richiesta a meno che non sia abilitata la cache opcode. L'estensione OPcache integrata di PHP memorizza il bytecode compilato nella memoria condivisa, eliminando il passaggio di compilazione per le richieste successive.
OPcache è un'impostazione a livello di server, non qualcosa che configuri tramite WordPress. La maggior parte degli ambienti di hosting moderni ha OPcache abilitato per impostazione predefinita. Puoi verificarlo controllando la tua configurazione PHP (phpinfo) o chiedendo al tuo provider di hosting. OPcache da solo può migliorare la velocità di esecuzione di PHP del 30-50%.
Cache CDN
Un CDN (Content Delivery Network) memorizza in cache i tuoi asset statici su server edge distribuiti in tutto il mondo. Quando un visitatore a Tokyo richiede un'immagine dal tuo sito WordPress ospitato ad Amsterdam, il CDN la consegna da un server edge vicino invece di instradare la richiesta fino ad Amsterdam. Questo riduce significativamente la latenza per gli asset statici. Alcuni provider CDN come Cloudflare offrono anche il caching completo delle pagine per WordPress tramite la loro funzionalità APO. Per maggiori dettagli vedi il nostro articolo sui Content Delivery Network.
Come funziona il caching della pagina passo dopo passo
Poiché il caching della pagina ha il maggiore impatto, ecco uno sguardo più ravvicinato a come funziona in pratica:
- Un visitatore richiede
tuodominio.com/chi-siamo/per la prima volta. - WordPress elabora la richiesta normalmente: PHP viene eseguito, il database viene interrogato, il template del tema viene renderizzato e l'HTML viene generato.
- Il plugin di caching memorizza una copia dell'HTML completato nel filesystem (di solito in
wp-content/cache/) o in memoria. - Un secondo visitatore richiede
tuodominio.com/chi-siamo/. - Il plugin di caching intercetta la richiesta prima che WordPress venga caricato. Trova il file HTML in cache e lo consegna direttamente. PHP viene a malapena eseguito e il database non viene toccato.
- Quando il contenuto della pagina cambia (un post viene aggiornato, un commento viene approvato), la cache per quella specifica pagina viene invalidata e la richiesta successiva genera una nuova copia.
Confronto tra i plugin di caching WordPress più popolari
Sono disponibili molti plugin di caching per WordPress. Ecco quelli più utilizzati e come si confrontano:
- WP Rocket: un plugin premium (a partire da 59 $/anno) ampiamente considerato come la soluzione di caching più facile da usare. Abilita il caching delle pagine, il caching del browser, la compressione GZIP e il lazy loading immediatamente con una configurazione minima. WP Rocket gestisce anche la minificazione CSS/JS, l'ottimizzazione del database e si integra con Cloudflare per la cancellazione della cache CDN. È la scelta migliore per i proprietari di siti che vogliono ottime prestazioni senza dedicare ore alla configurazione.
- W3 Total Cache: un plugin gratuito con una vasta gamma di funzionalità. Supporta il caching delle pagine, il caching degli oggetti (Redis, Memcached, APCu), il caching del browser, l'integrazione CDN e la minificazione. Lo svantaggio è la complessità. W3 Total Cache ha decine di pagine di impostazioni e una configurazione errata può danneggiare il tuo sito. È potente ma più adatto a sviluppatori o utenti avanzati.
- WP Super Cache: un plugin gratuito sviluppato da Automattic (l'azienda dietro WordPress.com). Si concentra sul caching delle pagine e mantiene le cose semplici. WP Super Cache genera file HTML statici e può servirli con regole mod_rewrite, il che è molto veloce. Manca delle funzionalità avanzate di WP Rocket e W3 Total Cache, ma è affidabile e facile da configurare.
- LiteSpeed Cache: un plugin gratuito che offre prestazioni eccezionali se utilizzato con server web LiteSpeed. Supporta il caching delle pagine, il caching degli oggetti, l'ottimizzazione delle immagini, la minificazione CSS/JS e l'integrazione CDN. Se il tuo hosting utilizza LiteSpeed (come fanno molti shared host), questo plugin beneficia del caching a livello di server che è più veloce del caching basato su PHP. Funziona anche su Apache e Nginx, ma con funzionalità limitate.
Soluzioni di caching a livello di server
Oltre ai plugin WordPress, il caching può anche avvenire a livello di server, il che è spesso più veloce perché intercetta le richieste prima ancora che PHP sia coinvolto:
- Varnish: una cache reverse proxy che si trova davanti al tuo server web. Varnish memorizza intere risposte di pagina in memoria e le serve direttamente per le richieste in cache. È estremamente veloce (tempi di risposta sub-millisecondo) ed è utilizzato da siti WordPress ad alto traffico. La configurazione richiede VCL (Varnish Configuration Language), che ha una curva di apprendimento.
- Nginx FastCGI Cache: se il tuo server utilizza Nginx (come fanno molti host WordPress moderni), il caching FastCGI memorizza l'output completo di PHP e lo serve direttamente da Nginx per le richieste successive. Questo è più veloce di qualsiasi plugin di caching basato su PHP perché Nginx gestisce completamente la richiesta senza invocare PHP. Molti host WordPress gestiti (Kinsta, GridPane, SpinupWP) utilizzano questo approccio.
- Redis Full-Page Cache: alcune configurazioni utilizzano Redis non solo per il caching degli oggetti ma anche per il caching completo delle pagine. L'HTML in cache viene memorizzato nella memoria Redis e un piccolo script PHP o un modulo Nginx lo serve direttamente. Questo combina la velocità dell'archiviazione in memoria con la flessibilità dell'invalidazione della cache basata su chiavi.
Caching degli oggetti con Redis e Memcached
Per i siti WordPress che gestiscono carichi pesanti di database, il caching persistente degli oggetti può essere trasformativo. Ecco come si confrontano le due principali opzioni:
- Redis: la scelta più popolare per WordPress. Redis memorizza i dati in memoria e supporta tipi di dati complessi (stringhe, hash, liste, set). Può persistere i dati su disco, supporta la replica e può essere utilizzato sia per il caching degli oggetti che per l'archiviazione delle sessioni. Il plugin Redis Object Cache è il modo più comune per collegare WordPress a Redis.
- Memcached: un sistema di caching in memoria più vecchio e più semplice. Memcached è veloce e leggero ma manca della persistenza dei dati e delle funzionalità avanzate di Redis. È ancora utilizzato in alcuni ambienti di hosting, in particolare quelli più vecchi.
Il caching persistente degli oggetti fa la differenza maggiore sui siti con query complesse: negozi WooCommerce con migliaia di prodotti, comunità BuddyPress, reti multisite o qualsiasi sito in cui il dashboard di amministrazione di WordPress sembra lento.
Quando il caching causa problemi
Il caching non è sempre semplice. Ci sono situazioni in cui il caching aggressivo causa problemi:
- Utenti loggati: il caching della pagina non deve servire pagine in cache agli utenti loggati, perché ogni utente vede contenuti diversi (il loro nome nell'header, la barra di amministrazione, il dashboard personale). Tutti i principali plugin di caching gestiscono questo correttamente per impostazione predefinita, ma le implementazioni personalizzate a volte sbagliano.
- WooCommerce ed e-commerce: carrelli, pagine di checkout e pagine "il mio account" sono dinamici e specifici per l'utente. Devono essere esclusi dal caching della pagina. WP Rocket e LiteSpeed Cache escludono automaticamente le pagine WooCommerce. Con altri plugin potresti dover configurare le esclusioni manualmente.
- Contenuto dinamico e AJAX: se il tuo sito si basa pesantemente su contenuti caricati tramite AJAX, dati in tempo reale o elementi personalizzati (prodotti visualizzati di recente, raccomandazioni specifiche per l'utente), il caching completo della pagina può servire contenuti obsoleti. Le soluzioni includono il caching dei frammenti (memorizzare in cache tutto tranne le parti dinamiche) o caricare contenuti dinamici tramite JavaScript dopo il caricamento della pagina in cache.
- Siti di abbonamento: i siti con più livelli di abbonamento mostrano contenuti diversi a diversi gruppi di utenti. Il caching della pagina deve tenere conto di queste variazioni, sia saltando la cache per gli utenti loggati, sia mantenendo versioni in cache separate per ruolo utente (cosa che la maggior parte dei plugin non supporta).
- Moduli e nonce: WordPress utilizza i nonce (token usa-e-getta) per la sicurezza nei moduli. Se una pagina con un modulo viene memorizzata in cache, tutti i visitatori ottengono lo stesso nonce, che può scadere e causare errori di invio dei moduli. I plugin di caching di solito gestiscono questo, ma è una fonte comune di problemi con i moduli personalizzati.
Invalidazione della cache: la parte difficile
C'è un famoso detto in informatica: "Ci sono solo due cose difficili nell'informatica: l'invalidazione della cache e dare nomi alle cose." L'invalidazione della cache è il processo di cancellazione o aggiornamento del contenuto in cache quando i dati sottostanti cambiano. In WordPress, questo significa:
- Quando pubblichi o aggiorni un post, la cache per quel post, gli archivi delle categorie, gli archivi dei tag, la homepage e qualsiasi pagina che mostra post recenti deve essere cancellata.
- Quando cambi le impostazioni del tema, l'intera cache della pagina deve essere cancellata, perché ogni pagina potrebbe apparire diversa.
- Quando viene approvato un nuovo commento, la versione in cache di quel post deve essere aggiornata per riflettere il nuovo commento.
I buoni plugin di caching gestiscono la maggior parte di questi scenari automaticamente tramite hook di WordPress. Ascoltano eventi come save_post, switch_theme e wp_update_comment_count e cancellano le voci di cache pertinenti. Tuttavia, se hai codice personalizzato che modifica i contenuti senza passare attraverso le funzioni standard di WordPress, la cache potrebbe non essere invalidata correttamente.
In caso di dubbio, la maggior parte dei plugin di caching fornisce un pulsante "Svuota tutta la cache" nella barra di amministrazione di WordPress. Usalo dopo aver apportato modifiche importanti se le pagine in cache non riflettono i tuoi aggiornamenti.
Cosa controlla InspectWP
InspectWP rileva se un plugin di caching WordPress è attivo cercando commenti HTML relativi alla cache (molti plugin aggiungono un commento come <!-- Cached by WP Rocket --> in fondo alla pagina), header di risposta (come X-Cache, X-Cache-Enabled o X-LiteSpeed-Cache) e firme di plugin note nel sorgente della pagina. Il report identifica quale plugin di caching è in uso, in modo da poter verificare che la tua configurazione di caching funzioni correttamente. Se non viene rilevato alcun caching, InspectWP lo segnala come un'opportunità di miglioramento delle prestazioni, poiché il caching è uno dei modi più efficaci per rendere più veloce qualsiasi sito WordPress.