Utilizzare Memcached per la cache dati PHP in ServBay
ServBay è un potente ambiente di sviluppo web locale che integra il pacchetto software Memcached ad alte prestazioni (server Memcached) e l’estensione PHP corrispondente, facilitando agli sviluppatori l’implementazione di una cache dati efficace nelle applicazioni PHP e migliorando sensibilmente le loro prestazioni.
In questo articolo illustreremo dettagliatamente come verificare e utilizzare Memcached e la relativa estensione PHP in ServBay.
Introduzione a Memcached
Memcached è un sistema di cache oggetti in memoria, distribuito e ad alte prestazioni. Archiviando temporaneamente i dati in memoria (come risultati di query al database, risposte API, frammenti di pagina, ecc.), Memcached riduce le richieste verso i sistemi di storage di backend (come il database), aumentando così la velocità di risposta e la capacità di gestione delle applicazioni web dinamiche.
Caratteristiche Principali
- Prestazioni elevate: I dati vengono conservati in memoria, garantendo una velocità di lettura e scrittura eccezionale.
- Distribuito: Permette di creare un pool di cache distribuita su più server, rendendo l’infrastruttura facilmente scalabile.
- Semplice da usare: Protocollo semplice, ampia disponibilità di librerie client, integrazione immediata.
- Riduzione del carico sul database: Riduce efficacemente il numero di query verso il database, particolarmente utile in scenari ad alta concorrenza.
Differenze tra le estensioni PHP memcache
e memcached
In PHP esistono due estensioni largamente utilizzate per la connessione ai server Memcached: memcache
e memcached
. Pur avendo nomi simili, si tratta di due estensioni differenti, che offrono API e funzionalità diverse:
Estensione
memcache
:- È l'estensione PHP storicamente più vecchia.
- Fornisce principalmente API di tipo procedurale (
memcache_connect()
,memcache_set()
, ecc.). - Funzionalità piuttosto basilari, non supporta alcune caratteristiche avanzate come l’hash coerente (anche se alcune librerie client lo implementano).
Estensione
memcached
:- Estensione PHP più recente (basata sulla libreria libmemcached).
- Offre API orientate agli oggetti (tramite la classe
Memcached
). - Supporta molte funzionalità avanzate, come hash coerente, protocollo binario, autenticazione SASL, opzioni di serializzazione flessibili, ecc.
- L’uso dell’estensione
memcached
è generalmente raccomandato per le sue maggiori funzionalità e per la manutenzione più attiva.
ServBay fornisce e raccomanda di default l’uso della più completa estensione PHP memcached
.
Pacchetto Memcached e l’estensione PHP in ServBay
ServBay integra il server Memcached come un pacchetto gestibile e pre-installa e attiva l’estensione PHP memcached
su tutte le versioni PHP integrate.
Questo significa che, nella maggior parte dei casi, dopo aver installato ServBay, sia il server Memcached che l’estensione PHP risultano già pronti all’uso, senza necessità di ulteriori compilazioni o configurazioni in PHP.
Verificare lo stato del pacchetto Memcached:
Nel pannello principale di ServBay o nella sezione di gestione dei pacchetti, puoi trovare il pacchetto Memcached
e controllare che sia in esecuzione. Se non lo è, prova ad avviarlo.
Verificare che l’estensione PHP memcached
sia caricata:
Il modo più semplice per verificare che una data versione di PHP abbia caricato correttamente l’estensione memcached
è usare la funzione phpinfo()
:
Crea un nuovo file PHP nella root del sito ServBay (di default
/Applications/ServBay/www
), ad esempioinfo.php
.All’interno del file inserisci il seguente codice:
php<?php phpinfo(); ?>
1
2
3Accedi a questo file tramite il sito web locale configurato su ServBay (ad esempio, se il dominio è
servbay.demo
, visitahttp://servbay.demo/info.php
).Cerca sulla pagina
phpinfo
la dicitura "memcached". Se noti una sezione "memcached" con dettagli di configurazione e versione, significa che l'estensione è stata attivata correttamente ed è disponibile.
Utilizzo di Memcached nel codice PHP
Una volta verificato che il server Memcached sia in esecuzione e l’estensione PHP memcached
sia attiva, puoi utilizzare la classe Memcached
nelle tue applicazioni PHP per connetterti al server ed eseguire operazioni di cache.
Di default, il server Memcached gira su localhost
alla porta standard 11211
.
Esempio di codice
Ecco un esempio di codice PHP che mostra come collegarsi al server Memcached locale tramite la classe Memcached
e come impostare e recuperare dei dati dalla cache:
Salva il seguente codice come file PHP nella directory del sito ServBay (ad esempio /Applications/ServBay/www/memcached_test.php
):
<?php
// Info server Memcached
$memcached_host = 'localhost';
$memcached_port = 11211;
// Crea l'istanza client Memcached
$memcached = new Memcached();
// Aggiungi il server Memcached al pool di connessione client
// Il metodo addServer() restituisce un booleano che indica se è stato aggiunto correttamente alla lista, ma non se la connessione è riuscita
if (!$memcached->addServer($memcached_host, $memcached_port)) {
// Nota: il fallimento di addServer è solitamente dovuto a problemi di configurazione, non necessariamente a problemi di connessione al server
die("Impossibile aggiungere il server Memcached alla lista del client. Controlla la configurazione di host e porta.");
}
// Prova a recuperare una chiave inesistente per testare la connessione (opzionale ma consigliato)
// get() restituisce false o un array vuoto se la chiave non esiste o ci sono problemi di connessione
// Memcached::getResultCode() può fornire uno stato più dettagliato
$test_key = 'servbay_memcached_connection_test';
$memcached->get($test_key); // Prova a recuperare una chiave inesistente
$result_code = $memcached->getResultCode();
if ($result_code !== Memcached::RES_NOTFOUND && $result_code !== Memcached::RES_SUCCESS) {
// Se non è RES_NOTFOUND o RES_SUCCESS, potrebbero esserci problemi di connessione
// Nota: RES_SUCCESS può essere restituito quando si recupera un valore vuoto
// Un controllo di connessione più rigoroso potrebbe richiedere logica aggiuntiva o comportamenti specifici del client
// In ambienti di sviluppo locali, quando addServer va a buon fine e le operazioni successive funzionano, la connessione può considerarsi stabile
echo "Attenzione: potrebbero esserci problemi nella connessione al server Memcached. Codice risultato: " . $result_code . "<br>";
// Nelle applicazioni reali potresti voler gestire gli errori in modo più approfondito
} else {
echo "Connessione al server Memcached riuscita ({$memcached_host}:{$memcached_port}).<br>";
}
// --- Esempio di operazioni di cache ---
// Dati da memorizzare in cache
$key = 'user_profile_1234';
$data = [
'id' => 1234,
'username' => 'servbay-demo',
'email' => '[email protected]',
'status' => 'active'
];
$expiration = 3600; // Tempo di scadenza cache, in secondi (qui 1 ora)
// Impostare i dati in cache
// Il metodo set() restituisce un booleano che indica il successo dell’operazione
if ($memcached->set($key, $data, $expiration)) {
echo "Dati memorizzati con successo in Memcached, chiave '{$key}', scadenza {$expiration} secondi.<br>";
} else {
echo "Memorizzazione in cache fallita!<br>";
// Puoi ottenere la causa del fallimento tramite $memcached->getResultCode()
echo "Codice risultato: " . $memcached->getResultCode() . "<br>";
}
// Prova a recuperare i dati dalla cache
echo "Tentativo di recuperare dati dalla cache...<br>";
$cachedData = $memcached->get($key);
if ($cachedData !== false) { // Memcached::get() restituisce false se il cache miss o in caso di errore
echo "Dati recuperati dalla cache con successo:<br>";
echo "<pre>";
print_r($cachedData);
echo "</pre>";
} else {
echo "Cache miss o recupero fallito, chiave '{$key}'.<br>";
echo "Codice risultato: " . $memcached->getResultCode() . "<br>";
}
// Esempio di gestione dei dati dopo la scadenza della cache (ipotizzando che sia passato del tempo)
// Normalmente, nell'applicazione controlleresti se $cachedData è false, e in caso contrario effettueresti una query alla fonte dati originaria (es. database) e poi memorizzeresti nuovamente il risultato in cache
// Esempio: Eliminare i dati dalla cache
/*
echo "Tentativo di eliminare i dati dalla cache...<br>";
if ($memcached->delete($key)) {
echo "Dati eliminati dalla cache con successo, chiave '{$key}'.<br>";
} else {
echo "Eliminazione dalla cache fallita!<br>";
echo "Codice risultato: " . $memcached->getResultCode() . "<br>";
}
// Provare nuovamente a recuperare i dati eliminati
echo "Ulteriore tentativo di recuperare i dati eliminati...<br>";
$cachedDataAfterDelete = $memcached->get($key);
if ($cachedDataAfterDelete !== false) {
echo "Recuperati i dati (eliminazione non riuscita):<br>";
print_r($cachedDataAfterDelete);
} else {
echo "Dati non più presenti in cache (come previsto).<br>";
echo "Codice risultato: " . $memcached->getResultCode() . "<br>";
}
*/
// Esempio: Svuotare tutta la cache (usare con cautela!)
/*
echo "Tentativo di svuotare tutta la cache...<br>";
if ($memcached->flush()) {
echo "Tutti i dati in cache sono stati rimossi.<br>";
} else {
echo "Svuotamento cache fallito!<br>";
echo "Codice risultato: " . $memcached->getResultCode() . "<br>";
}
*/
?>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
Visita il file memcached_test.php
tramite il sito web locale configurato su ServBay per visualizzare l’output relativo alla connessione, al salvataggio e al recupero dei dati dalla cache.
Note Importanti
- Assicurati che il pacchetto Memcached in ServBay sia in esecuzione.
- Di default, Memcached è in ascolto su
127.0.0.1
(olocalhost
) alla porta11211
. Solitamente non è necessario modificare questa impostazione. - Se la connessione da PHP fallisce, verifica lo stato del pacchetto Memcached e assicurati che il firewall non blocchi le connessioni locali.
- Il metodo
addServer
della classeMemcached
si limita ad aggiungere il server al pool; non apre una connessione persistente né verifica immediatamente la disponibilità del server. Le connessioni e le operazioni reali avvengono quando esegui metodi comeget
,set
, ecc. Verifica il valore di ritorno di queste operazioni o l’output digetResultCode()
per controllarne il successo.
Conclusioni
ServBay offre agli sviluppatori un modo estremamente comodo per utilizzare Memcached. Grazie all’integrazione del pacchetto Memcached e all’attivazione predefinita dell’estensione PHP memcached
, puoi beneficiare di una cache dati efficace senza complicazioni di installazione o configurazione, velocizzando così lo sviluppo di applicazioni PHP ad alte prestazioni nel tuo ambiente locale.