Memcached è un utilissimo strumento diffuso nel 2009 dalla Danga Interactive. Il suo obiettivo principale è quello di ridurre il carico sul database sfruttando direttamente la RAM disponibile sul server. I grandi colossi del web come Facebook, Wikipedia, Twitter, YouTube e WordPress sono i più famosi utilizzatori di Memcached, ma anche i siti meno conosciuti possono adottarlo per migliorare l’esperienza dei propri utenti.
Configurazione di Memcached
Per prima cosa è necessario andare sul sito ufficiale e scaricare l’ultima versione stabile disponibile. In Homepage è evidenziata di colore rosso sul lato destro. Assicuratevi di aver installato le librerie libevent e successivamente scompattate la cartella di Memcached. In questa cartella eseguite quindi i comandi:
./configure make make install
e se non visualizzate errori, procedete con l’avvio tramite il comando:
memcached -m 16 -p 15711 -u www-data -l 127.0.0.1 –d
- -m: indica la quantità di RAM massima che il software può utilizzare;
- -p: indica la porta di ascolto;
- -u: ovvero l’utente;
- -l: precede l’indirizzo IP sul quale Memcached sarà bindato
- -d: serve per avviare il processo sotto forma di demone, in background.
Per avere una schermata con tutte le opzioni possibili, lanciate il comando: memcached -h
Integrare Memcached con PHP
Grazie anche all’utilizzo di questo software da parte dei Big di internet, ormai esistono le API per quasi tutti i linguaggi e database disponibili. In questa guida però vogliamo mostrarti come integrare Memcahced con PHP.
Prima di procedere però è necessario lanciare questo comando per installare l’estensione PECL:
pecl install memcache
Ora per connettersi a Memcached scrivi:
<?php <?php $memcached_host = "127.0.0.1"; $memcached_port = 15711; $memcache = new Memcache; $memcache->connect($memcached_host, $memcached_port); ?> ?>
Se ad esempio abbiamo questa funzione:
<?php function getUserById($user_id) { // recupera dal database i dati dell’utente $sql = "SELECT * FROM users WHERE user_id = :user_id"; $stmt = $this->_db->prepare($sql); $result = $stmt->execute(array(":user_id" => $user_id)); $user = $stmt->fetch(PDO::FETCH_ASSOC); // restituisce il risultato return $user; } ?>
dobbiamo impostare Memcached affinché i dati vengano chiesti direttamente alla cache di Memcached senza interrogare il database. Nel caso in cui questi dati non siano presenti dobbiamo indicare a Memcached di recuperali dal database e salvarli per restituirli all’utente. Questa regola può essere impostata così:
<?php function getUserById($user_id) { // controlla se l’utente è già presente in cache if($this->_cache->get('user'.$user_id) { // se lo trova, restituisce i dati return $this->_cache->get('user'.$user_id); } // recupera dal database i dati dell’utente $sql = "SELECT * FROM users WHERE user_id = :user_id"; $stmt = $this->_db->prepare($sql); $result = $stmt->execute(array(":user_id" => $user_id)); $user = $stmt->fetch(PDO::FETCH_ASSOC); // salva i dati in memcached per la prossima volta $this->_cache->add('user'.$user_id, $user); // restituisce il risultato return $user; } ?>
Memcached: alcuni accorgimenti per la sicurezza
Non essendoci alcun sistema di autenticazione, è fondamentale proteggere il sistema assicurandosi innanzitutto che la porta d’ascolto sia accessibile solo a Memcached. Possiamo servirci di iptables per ovviare questo problema, le regole da aggiungere sono le seguenti:
iptables -A INPUT -s SERVER_IP –dport 15711 -j ACCEPT iptables -A INPUT –dport 15711 -j DROP
La prima consente al server di accedere a Memcached, e va ripetuta per tutti gli indirizzi IP dei server; la seconda nega l’accesso a tutti gli IP non indicati precedentemente.
Sul fronte sicurezza recentemente è stata rilasciata l’autenticazione SASL, che deve essere abilitata nel caso in cui non sia possibile isolarsi attraverso il classico firewall. Per attivarla è necessario lanciare il comando
–enable-sasl e avviato col flag –s.