Skip to content

Tutto per WordPress, lo sviluppo web — e non solo

💡 Come ridurre il carico del server e velocizzare WordPress con Memcached

💡 Come ridurre il carico del server e velocizzare WordPress con Memcached

Un sito WordPress senza caching assomiglia a un motore che si riscalda da zero a ogni semaforo. Un visitatore arriva su una pagina, PHP la assembla partendo da zero, interrogando il database dalle 30 alle 60 volte. Dieci visitatori simultanei significano trecento query. Cinquanta visitatori creano una valanga che fa cadere le connessioni del server più velocemente di quanto tu riesca a finire di digitare un comando nella console.

Il problema non è WordPress in sé. L'assemblaggio dinamico delle pagine è intrinsecamente dispendioso per impostazione predefinita; quasi tutti i CMS funzionano così. La soluzione è stata provata in anni di operatività su progetti ad alto carico: il caching degli oggetti in RAM tramite Memcached. Un layer Memcached configurato correttamente trasforma un server che va in affanno con cinquanta utenti concorrenti in una macchina che ne gestisce centinaia senza un solo millisecondo di esitazione nel tempo di risposta.

Vedremo il ciclo completo di configurazione: dall'installazione del demone fino a un test di carico che mostra la differenza in numeri. Tutti i comandi sono stati testati su Ubuntu 22.04/24.04 e AlmaLinux 9, e sono compatibili con PHP 8.2-8.5.

💡 Panoramica rapida:

  • Installa il demone Memcached e vincolalo a localhost per sicurezza
  • Compila l'estensione PHP memcached via PECL per la tua versione di PHP
  • Posiziona il drop-in object-cache.php di Automattic nella directory wp-content
  • Installa Batcache e configura advanced-cache.php per il caching delle pagine
  • Verifica gli header di risposta tramite i DevTools del browser
  • Esegui un test di carico con k6 e confronta i risultati prima e dopo

Cos'è Memcached e perché serve al tuo WordPress

Memcached è un demone che memorizza dati e oggetti nella RAM del server. A differenza del caching basato su file (WP Super Cache, W3 Total Cache, WP Rocket), che scrive HTML già pronto su disco, Memcached opera un livello più in basso: i risultati delle query al database, i menu assemblati, i widget e le impostazioni del sito risiedono in RAM e possono essere recuperati in microsecondi senza riassemblaggio.

In pratica, lo scenario è questo. Una tipica pagina WordPress senza caching effettua dalle 30 alle 60 query a MySQL. Con 50 visitatori concorrenti, il database riceve da millecinquecento a tremila query e la CPU va in crisi. Memcached intercetta la stragrande maggioranza di queste query a livello di RAM: il database riposa, la CPU resta libera e il server risponde all'istante.

Tecnicamente, Memcached opera su coppie chiave-valore. La chiave è un hash della query SQL; il valore è il risultato serializzato. Quando WordPress assembla di nuovo la stessa pagina, chiede prima a Memcached: «Hai questa chiave?» e quasi sempre riceve una risposta pronta senza un singolo accesso al disco.

La tecnologia è nata nel 2003 all'interno di LiveJournal come soluzione a problemi di carico estremo sul database. Oggi WordPress.com, Wikipedia, Twitter e migliaia di progetti ad alto carico girano su Memcached. È maturo, stabile e prevedibile: esattamente ciò che serve in produzione.

Installare il demone Memcached

Tratteremo due scenari principali: Ubuntu (22.04/24.04) con apt e AlmaLinux / Rocky Linux 9 con dnf. Adatta i comandi alla tua distribuzione.

Su Ubuntu:

1sudo apt update && sudo apt install memcached libmemcached-tools -y

Su AlmaLinux / Rocky Linux 9:

1sudo dnf install memcached libmemcached -y

Dopo l'installazione, il demone si avvia automaticamente. Verifica:

1systemctl status memcached

Per impostazione predefinita, Memcached è in ascolto sulla porta 11211 su tutte le interfacce di rete. Questa è una falla di sicurezza: la tua cache è accessibile a chiunque possa raggiungere quella porta dall'esterno. Pertanto, vincola prima il demone a localhost.

Apri il file di configurazione (/etc/memcached.conf su Ubuntu, /etc/sysconfig/memcached su AlmaLinux) e assicurati che la riga -l 127.0.0.1 sia presente e non commentata. Riavvia il demone:

1sudo systemctl restart memcached

Compilare l'estensione PHP via PECL

Il demone da solo non velocizzerà WordPress; serve un client PHP che insegni a PHP a comunicare con Memcached. Installa l'estensione memcached (attenzione: specificamente memcached con la lettera d, non memcache). Quest'ultima è stata rimossa da PHP a partire dalla versione 8.0 e non dovrebbe essere usata.

Su Ubuntu, installa prima gli strumenti di compilazione. Sostituisci la tua versione di PHP: php8.4-dev, php8.3-dev o php8.2-dev:

1sudo apt install php8.4-dev php-pear libmemcached-dev pkg-config make gcc -y

Poi compila l'estensione:

1sudo pecl install memcached

Su AlmaLinux / Rocky Linux 9, il set è simile:

1sudo dnf install php-devel php-pear libmemcached-devel make gcc -y
2sudo pecl install memcached

Dopo la compilazione, l'estensione va registrata in PHP. Crea un file INI:

1echo "extension=memcached.so" | sudo tee /etc/php/8.4/mods-available/memcached.ini
2sudo phpenmod memcached

Su AlmaLinux, il percorso sarà diverso: /etc/php.d/memcached.ini.

Se lavori in Plesk Obsidian, il comando per ricaricare gli handler PHP dopo aver installato l'estensione:

1plesk bin php_handler --reread

Verifica che l'estensione sia stata caricata:

1php -m | grep memcached

L'output deve contenere memcached. Se è vuoto, controlla il percorso del file INI e riavvia PHP-FPM: sudo systemctl restart php8.4-fpm.

Connettere WordPress a Memcached

Il demone è installato; l'estensione PHP è caricata. Ora devi connettere WordPress a Memcached a livello applicativo.

Lo standard de facto oggi è il drop-in ufficiale di Automattic: wp-memcached su GitHub. È scritto dagli stessi sviluppatori che mantengono Batcache e WordPress.com, e funziona correttamente con PHP 8.x (incluse le versioni 8.4 e 8.5).

Copia il file object-cache.php dal repository nella cartella /wp-content/ del tuo sito. WordPress lo rileverà automaticamente e inizierà a usare Memcached come backend della object cache, senza plugin aggiuntivi.

Se la porta di Memcached è diversa da quella predefinita (11211), aggiungi quanto segue a wp-config.php:

1$memcached_servers = array(
2 array( '127.0.0.1', 11211 )
3);

Page caching: Batcache

La object cache è metà dell'opera. L'altra metà è memorizzare nella cache le pagine HTML già pronte, in modo che PHP non venga affatto eseguito per i visitatori anonimi. È qui che entra in gioco Batcache, un plugin di Automattic che archivia le pagine generate nello stesso Memcached.

Il principio è semplice. Un visitatore arriva sul sito; Batcache verifica se in Memcached esiste una copia HTML già pronta di quella pagina. Se c'è e non è scaduta, la serve all'istante, bypassando l'intera catena PHP e MySQL. Se non c'è, o se il visitatore ha effettuato l'accesso, la pagina viene generata ex novo e contemporaneamente salvata in cache per le visite successive.

Installazione:

Scarica l’archivio da wordpress.org, estrailo e carica il file advanced-cache.php nella root di /wp-content/. Poi apri wp-config.php e aggiungi la riga che abilita la cache:

1define( 'WP_CACHE', true );

Invia il file batcache.php in /wp-content/plugins/ e attiva il plugin dal pannello di amministrazione.

Dentro advanced-cache.php, sotto i commenti, ci sono circa una dozzina di impostazioni. Le più utili: max_age (durata di vita della pagina in secondi, default 300 ovvero 5 minuti), seconds (intervallo tra rigenerazioni dello stesso URL) e unique (non memorizzare nella cache User-Agent diversi separatamente). Per la maggior parte dei siti i valori predefiniti funzionano; modificali solo quando hai chiaro il perché.

Una sfumatura importante: assicurati che define( 'WP_CACHE', true ) compaia PRIMA della riga require_once ABSPATH . 'wp-settings.php' in wp-config.php. Se messa dopo, la cache non si attiverà e WordPress la ignorerà in silenzio.

Video: installazione e configurazione dall’inizio alla fine

La teoria è la base, ma i comandi da console è meglio vederli una volta. Questo video copre il ciclo completo di configurazione della cache a oggetti per WordPress con Redis e Memcached, dall’installazione del demone alla verifica del risultato:

Verificare che Memcached funzioni

Il test migliore è quello pratico. Aggiungi un header personalizzato in advanced-cache.php per vedere visivamente se la pagina è stata servita dalla cache o generata ex novo.

Trova questa riga in advanced-cache.php:

1var $headers = array();

Sostituiscila con:

1var $headers = array( 'memcached' => 'activated' );

Ora apri DevTools nel browser (F12), vai alla scheda Network e ricarica la pagina diverse volte. Negli header di risposta vedrai il campo memcached: activated, che indica che Batcache ha funzionato e la pagina è arrivata al client direttamente dalla RAM.

Un metodo aggiuntivo prevede l'uso della riga di comando del server. Visualizza le statistiche del demone:

1echo "stats" | nc 127.0.0.1 11211

Nell'output, cerca get_hits e get_misses. Se get_hits cresce quando aggiorni le pagine del sito nel browser, Memcached sta servendo in modo affidabile gli oggetti in cache.

Test di carico: numeri, non impressioni

Memcached mostra il suo vero valore sotto pressione. Il test originale su un server con 1 core e 512 MB di memoria ha prodotto un contrasto impressionante: senza Memcached, il server è andato in crash dopo 15 secondi con 50 utenti concorrenti; con Memcached, ha retto oltre 400 utenti per 50 secondi senza un solo errore. Non è magia ma fisica: quando la CPU non spreca cicli a riassemblare le stesse pagine, serve nuovi visitatori.

Per fare auto-test oggi si usano strumenti moderni. Uno dei più comodi è k6 di Grafana (open source, si esegue con un solo comando). Un test di base:

1k6 run --vus 100 --duration 30s http://your-site.com/

100 utenti virtuali per 30 secondi. Confronta i risultati con Batcache disattivato (commenta WP_CACHE) e attivato; la differenza in risposte riuscite e latenza mediana si misurerà in ordini di grandezza.

Per un controllo rapido senza installare software, lo strumento web Loader.io funziona bene; il piano gratuito consente fino a 10.000 client per test, più che sufficienti per la maggior parte dei siti.

Redis o Memcached: quale scegliere

La domanda che sorge inevitabilmente è: perché non Redis? Entrambi sono archivi chiave-valore in memoria; entrambi funzionano con WordPress tramite drop-in. La risposta breve: per la pura memorizzazione nella cache, Memcached è più semplice e veloce; per tutto il resto, Redis.

Confrontiamo gli aspetti essenziali:

Criterio

Memcached

Redis

Modello dati

Solo stringhe

Stringhe, liste, set, hash, dati geo, pub/sub

Multi-threading

Usa tutti i core nativamente

Principalmente single-threaded

Persistenza

Nessuna (pura memoria)

RDB/AOF (salva su disco)

Ecosistema WordPress

Automattic/wp-memcached + Batcache

Redis Object Cache (oltre 400.000 installazioni)

Complessità di configurazione

Minima

Leggermente superiore

Svuotamento cache al riavvio

Completo (ma si riscalda in minuti)

Può essere preservato

Per la cache degli oggetti di WordPress, il modello chiave-valore a stringhe è più che sufficiente. I tipi di dati aggiuntivi di Redis qui non servono. Sulle operazioni get/set, entrambi sono limitati più dal throughput di rete che dalla CPU; a parità di condizioni, sono equivalenti. Memcached vince sul multi-threading: usa tutti i core della CPU nativamente, mentre Redis mantiene un'architettura prevalentemente single-threaded.

Scegli Redis se memorizzi anche sessioni, code di attività o hai bisogno di persistenza. Per il compito di "velocizzare WordPress e alleggerire il database", Memcached dà risultati più rapidamente e con meno componenti in gioco.

⁉️🤔 Domande frequenti

Mi serve Memcached su un hosting condiviso?

Sulla maggior parte dei piani di hosting condiviso, Memcached non è disponibile: i provider non concedono accesso al demone a livello di server. Tuttavia, se il tuo piano include un VPS o un server dedicato, l'installazione richiede da 10 a 15 minuti e produce uno dei guadagni di velocità più evidenti tra tutte le ottimizzazioni WordPress. Verifica le funzionalità del tuo piano nel pannello di controllo o chiedi all'assistenza dell'hosting.

Batcache o WP Rocket: qual è meglio?

WP Rocket è un multi-strumento che gestisce la cache delle pagine (su file), l'ottimizzazione di CSS/JS e il lazy loading. Batcache è uno strumento specifico per la cache delle pagine su Memcached. Non competono; si completano a vicenda: Batcache lavora a livello di server e serve le pagine senza avviare PHP, mentre WP Rocket opera a livello applicativo. In pratica, spesso si usano entrambi: Batcache per i visitatori anonimi, WP Rocket per un'ottimizzazione di fino.

Come svuoto la cache di Memcached?

Il metodo più semplice è riavviare il demone: sudo systemctl restart memcached. La cache si svuoterà completamente e ricomincerà a riscaldarsi alle visite successive. Per una pulizia mirata, usa il plugin Query Monitor: mostra il contenuto della cache oggetti e consente di svuotare singole chiavi. C'è anche un'opzione da console: echo "flush_all" | nc 127.0.0.1 11211.

Perché il sito non è diventato più veloce dopo aver installato object-cache.php?

Il motivo più comune è che l'estensione PHP non è stata caricata. Verifica con php -m | grep memcached. Se l'output è vuoto, controlla il percorso del file INI e riavvia PHP-FPM. Il secondo motivo comune: object-cache.php non è stato copiato in /wp-content/ o è stato copiato con errori di permesso (deve essere leggibile dall'utente che esegue PHP). Terzo: il demone Memcached non è in esecuzione; verifica con systemctl status memcached.

Memcached è in conflitto con OPcache?

No, sono livelli diversi. OPcache memorizza il bytecode PHP compilato e accelera l'avvio dell'interprete. Memcached memorizza i dati applicativi: i risultati delle query al database. Lavorano in fasi diverse dell'elaborazione della richiesta e si completano bene a vicenda. In produzione, si consiglia di usarli entrambi.

Si può usare Memcached su più server?

Sì, è uno degli scenari principali. Nella configurazione $memcached_servers puoi elencare diversi indirizzi IP di demoni Memcached e il client distribuirà automaticamente le chiavi tra di essi. Per WordPress, il drop-in object-cache.php gestisce questa cosa: supporta nativamente un pool di server.

Conviene installare Memcached sul tuo server

Installare Memcached non è una panacea ma uno dei passi più efficaci nell'ottimizzazione di WordPress. Se il tuo sito gira su un VPS o un server dedicato e vuoi che gestisca una crescita del traffico di diverse volte senza cambiare hardware, installalo. Dieci, quindici minuti di lavoro da console e il database smette di essere un collo di bottiglia.

Se il sito è su hosting condiviso senza accesso al demone, valuta Redis (più spesso disponibile) o la cache su file tramite WP Rocket. Se sei già su un VPS, apri il terminale e segui i passaggi della panoramica rapida qui sopra. Il risultato lo vedrai al primo test di carico.