Introduzione
Memcached è un sistema cache in RAM a oggetti distribuiti sviluppato da Danga Interactive nel 2003 originariamente per migliorare la velocità di LiveJournal. Memcached diminuisce il tempo di caricamento delle pagine dei siti web dinamici basati su database mettendo in cache i dati richiesti e riducendo il carico sui server database, l’uso del software è stato, in breve tempo, esteso ad altri CMS fra cui Mediawiki e Joomla!. È utilizzato da vari siti web come Wikipedia, Facebook, e Zynga. Il supporto memcached è inoltre fornito via API di varie piattaforme quali Google App Engine, Amazon Web Services e Windows Azure.
Quando pensiamo allo storage in un’applicazione web, il nostro primo pensiero è di solito un database tradizionale come MySQL. Questo è ottimo per l’archiviazione e l’analisi dei dati a lungo termine, ma esiste un’opzione migliore per molte esigenze a breve termine: Memcached. Questo piccolo software è un’ottima scelta per salvare bit di informazioni per le richieste di pagine e aumentare le prestazioni di siti e applicazioni web.
Memcached è un programma ad alte prestazioni, gratuito e open source che permette di memorizzare oggetti in cache. Nella memoria RAM di sistema vengono salvate le chiamate ripetute di oggetti PHP e database per velocizzare le applicazioni web dinamiche.
In un’altra guida abbiamo visto come installare OPCACHE per salvare in cache l’output dei file PHP eseguiti. OPcache serve per accelerare l’accesso al codice, mentre Memcached serve ad accelerare l’accesso ai dati. Sono completamente diversi ed indipendenti. Memcached agisce prevalentemente sul database, come Redis, è un archivio di valori-chiave in memoria per piccoli blocchi di dati arbitrari (stringhe, oggetti) generati dai risultati di chiamate al database, chiamate API o rendering della pagina.
Memcached memorizza i dati e gli oggetti direttamente nella memoria (RAM) e riduce il numero di chiamate necessarie ad esempio verso il database o chiamate API. Questo aiuta soprattutto i sistemi dinamici come CMS WordPress o Joomla! migliorando notevolmente i tempi di elaborazione anche per eCommerce come Prestashop e Magento.
L’uso di Memcached con Nginx, PHP-FPM su WordPress o altri siti web o CMS è un ottimo modo per migliorare le loro prestazioni. Memcached è un programma di memorizzazione nella cache semplice ma potente che i webmaster e i proprietari di siti web dovrebbero utilizzare se possibile.
Questo breve tutorial ti mostrerà come installare Memcached su Ubuntu 17.04 | 17.10 con Nginx e PHP-FPM. Prima di iniziare, tieni presente che Memcached non ha misure di sicurezza integrate per ambienti di hosting condivisi, questo significa che se cancelli la cache, la cancelli per tutti i siti condivisi! Questa guida deve essere utilizzata solo su un server dedicato.
Installare Memcached
Come prerequisiti il tuo server deve avere PHP-FPM e Nginx già installati. Accedi al server via SSH, con utente non root con poteri sudo, e digita i seguenti comandi per aggiornare i repository ed installare Memcached.
sudo apt update
sudo apt install memcached
Dopo aver installato Memcached, puoi usare seguenti comandi per arrestare, avviare e abilitare il servizio.
sudo systemctl stop memcached.service
sudo systemctl start memcached.service
sudo systemctl enable memcached.service
Ora esegui i comandi che seguono per installare i moduli necessari a far comunicare Memcached con PHP e Nginx. Puoi anche installare libmemcached-tools, una libreria che fornisce diversi strumenti per lavorare con il tuo server Memcached. Esistono tecnicamente due librerie PHP disponibili per lavorare con memcached. La libreria più vecchia si chiama “memcache” e manca di alcune funzionalità. La nuova libreria “memcached” utilizza libmemcached ed è generalmente preferita.
sudo apt-get install php-fpm php-memcached php-cli
# opzionale
sudo apt-get install libmemcached-tools
Riavvia il servizio Nginx.
sudo systemctl reload nginx.service
Configurare Memcached
Il file di configurazione di Memcached si trova in:
/etc/memcached.conf
Apri il file di configurazione di Memcached digitando il comando seguente:
sudo nano /etc/memcached.conf
La versione corrente di Memcached fornita con Ubuntu e Debian ha il parametro -l impostato sull’interfaccia locale, che impedisce gli attacchi denial of service dalla rete. Puoi controllare questa impostazione per assicurarti che sia impostata correttamente. Trova la seguente riga:
-l 127.0.0.1
Se vedi l’impostazione predefinita -l 127.0.0.1, non è necessario modificare questa riga. Se modifichi questa impostazione per renderla più aperta, allora è anche una buona idea disabilitare UDP, poiché è più probabile che venga sfruttato in attacchi denial of service. Per disabilitare UDP (lasciando inalterato TCP), aggiungi la seguente opzione alla fine di questo file:
-U 0
Salva e chiudi il file quando hai finito. Riavvia il servizio Memcached per applicare le modifiche:
sudo systemctl restart memcached
Verifica il funzionamento di Memcached
Per verificare che Memcached sia installato, esegui i comandi seguenti per creare un file php di prova.
sudo nano /var/www/html/phpinfo.php
Quindi copia e incolla il contenuto qui sotto nel file e salva.
<?php
phpinfo();
?>
Dopo aver salvato il file, apri il browser e cerca il nome host o l’indirizzo IP del server seguito da phpinfo.php
esempio: http://tuosito.com/phpinfo.php
Dovresti vedere tutti i moduli relativi a PHP e le informazioni su Memcached. Se trovi il box di Memcached allora il servizio è installato e abilitato.
Verifica che Memcached sia attualmente associato all’interfaccia locale e che ascolti solo le connessioni TCP digitando:
sudo netstat -plunt
Dovresti vedere il seguente output:
Ciò conferma che Memcached è associato all’indirizzo 127.0.0.1 e utilizza solo il protocollo TCP.
Per monitorare e ottenere alcune statistiche da Memcached è possibile utilizzare il seguente comando:
echo "stats settings" | nc localhost 11211
Vediamo un altro metodo per verificare il funzionamento di Memcached con PHP. In questo passaggio creiamo un semplice script PHP ed utilizziamo la classe Memcached per memorizzare nella cache alcuni dati. Crea un file /var/www/html/test_memcached.php nella radice del tuo sito web utilizzando un editor di testo. Quindi, incolla il codice PHP sottostante sul file e salva il file.
<?php
try
{
$memcached = new Memcached();
$memcached->addServer("127.0.0.1", 11211);
$response = $memcached->get("sample_key");
if($response==true)
{
echo $response;
}
else
{
echo "Cache is empty";
$memcached->set("sample_key", "Sample data from cache") ;
}
}
catch (exception $e)
{
echo $e->getMessage();
}
?>
Il server Memcached utilizza una coppia chiave/valore per memorizzare i dati nella cache. Il codice sopra indica a PHP di creare un’istanza della classe Memcached e di aggiungere un server con l’indirizzo IP 127.0.0.1 tramite la porta 11211. Il codice tenta quindi di recuperare il valore di una chiave denominata sample_key. Se la chiave è presente sul server, verrà restituito il suo valore, altrimenti il codice proverà a creare la chiave e ad aggiungere un valore di “Sample data from cache”.
Visita il percorso del file sul tuo browser per vedere Memcached in azione. Sostituisci 172.16.0.1 con l’indirizzo IP Internet associato al tuo web server. Quando esegui il codice per la prima volta, otterrai l’output “Ceche is empty”.
Successivamente, aggiorna la pagina e questa volta Memcached dovrebbe recuperare il valore memorizzato nella cache quando il codice è stato eseguito per la prima volta: “Sample data from cache”. Questa stringa conferma il corretto funzionamento di Memcached.
Cancellare la cache
È possibile invalidare tutti gli elementi della cache esistenti utilizzando il comando flush_all. Questo comando non libera la memoria, fa solo scadere tutti gli elementi. È possibile inviare il comando flush_all utilizzando telnet:
telnet localhost 11211
flush_all
quit
Oppure un comando echo:
echo "flush_all" | nc -q 2 localhost 11211
Conclusione
In questo tutorial hai imparato ad installare Memcached configurandolo per comunicare con Nginx e PHP-FPM. Per saperne di più su Memcached, consulta la documentazione del progetto.