Il tuo ultimo sito Web PHP / MySQL è finalmente online. Ed è fantastico Ma non è veloce come vuoi, a causa delle molte query SQL in esecuzione ogni volta che viene generata una pagina. E soprattutto, si ha la sensazione che non si scalerà bene sotto carichi pesanti. E tu hai probabilmente ragione.
In questo tutorial, vedremo come è possibile migliorare notevolmente la reattività del tuo sito web e aiutarlo a scalare per gestire molti visitatori simultanei, implementando uno strato di cache tra il tuo codice e il tuo database. La buona notizia è che è abbastanza facile e può essere fatto in pochi minuti!
Memcached è un sistema di caching dei dati in memoria ad alte prestazioni.
I siti Web e le applicazioni Web moderni utilizzano molti dati e non è inusuale contare fino a 20 o anche 30 query SQL in una singola generazione di pagine. Moltiplicare questo importo per un numero elevato di visitatori e spesso si ottiene un database sovraccarico e le pagine che impiegano secondi per essere generate e inviate al client.
Il tool che useremo oggi per migliorare le prestazioni è chiamato Memcached. È un sistema di memorizzazione dei dati in memoria ad alte prestazioni. O per dirla in un altro modo, un'applicazione molto veloce che gira sul tuo server e utilizza una frazione della memoria disponibile per archiviare un array associativo di dati. Puoi chiedere a Memcached di fare due cose:
V
con la chiave K
V
memorizzato con la chiave K
Questo sembra minimalista, ma c'è molto che puoi fare grazie a queste due funzionalità, come vedremo molto presto. In effetti, Memcached può fare ancora un paio di cose, ma sono tutte legate alla memorizzazione o al recupero dei dati.
Installare Memcached sulle moderne distribuzioni Linux è abbastanza semplice:
sudo apt-get install memcached
sudo emerge installa memcached
sudo yum installa memcached
Una volta installato, Memcached verrà avviato automaticamente ogni volta che si avvia il server. È possibile impostare la quantità di memoria riservata per Memcached, insieme ad altre opzioni, nel file di configurazione (/etc/memcached.conf
). 64 Mb è assegnato per impostazione predefinita. Il file di configurazione contiene anche l'indirizzo IP e la porta a cui Memcached sarà associato. Valori standard (127.0.0.1
e 11211
) vanno bene per una configurazione standard.
Vogliamo memorizzare e recuperare i dati dai tuoi script PHP. Questo significa che avremo bisogno di un modo per connettersi a Memcached da PHP. Per questo, installeremo l'estensione "Memcache" per PHP. Poiché è un'estensione PECL, è molto facile da installare con "pecl" digitando il seguente comando:
sudo pecl installa memcache
Ci sono due estensioni PHP relative a Memcache: "Memcache" e "Memcached" (notare la "d" nella seconda). Entrambi sono molto simili, ma il primo ha un ingombro minore. In questo tutorial, useremo il leggero Memcache. Una volta installata, questa estensione dovrebbe essere abilitata e le funzioni relative a Memcache dovrebbero essere ora disponibili per gli script PHP.
Il nostro lavoro qui è basato sulle seguenti ipotesi:
Vogliamo anche archiviare i nostri dati in un modo che ci consenta di recuperarli in modo efficiente.
In generale, vogliamo salvare i nostri dati in un ambiente persistente (ad esempio il nostro database MySQL). Ma vogliamo anche archiviare i nostri dati in un modo che ci consenta di recuperarli in modo efficiente, anche se lo spazio di archiviazione non è persistente. Quindi alla fine avremo due copie dei nostri dati : uno viene memorizzato in MySQL e l'altro viene memorizzato in Memcache.
Ecco i passi che dobbiamo compiere per fare in modo che ciò accada:
INSERT
e UPDATE
) sarà eseguito sia su MySQL che su MemcachedSELECT
) verrà eseguito in Memcached e ricadrà su MySQL in caso di erroreA questo punto, probabilmente vedi quali parti del tuo codice devono essere modificate: parti in cui scrivi dati e parti in cui leggi i dati. Se il tuo codice PHP è ben strutturato, dovresti aver avvolto il tuo codice di accesso ai dati in funzioni o anche in classi migliori. Se è così, l'aggiornamento del tuo sito dovrebbe essere molto veloce. In caso contrario, potresti avere un po 'più di lavoro.
Prima di tutto, creiamo una connessione al nostro server Memcached. Ecco il codice che dovresti usare, all'inizio degli script PHP:
// Costanti di connessione define ('MEMCACHED_HOST', '127.0.0.1'); define ('MEMCACHED_PORT', '11211'); // Creazione di connessioni $ memcache = new Memcache; $ cacheAvailable = $ memcache-> connect (MEMCACHED_HOST, MEMCACHED_PORT);
A questo punto, abbiamo stabilito una connessione al nostro server Memcache. Potrebbe aver fallito, ma lo sappiamo grazie al $ cacheAvailable
variabile.
Diamo un'occhiata alla memorizzazione dei dati. Faremo un esempio per rendere le cose più chiare: un negozio online. Abbiamo un copione chiamato edit_product.php
il cui scopo è quello di salvare i dati di un prodotto nel nostro database. Ciascuno dei nostri prodotti ha le seguenti informazioni:
Ad un certo punto nel nostro edit_product.php
codice, eseguiamo un INSERIRE
o AGGIORNARE
Query SQL il cui scopo è quello di scrivere i dati di questo prodotto nel nostro database MySQL. Potrebbe assomigliare a questo:
// Abbiamo convalidato e disinfettato i nostri dati // Siamo sfuggiti a ogni char rischioso con mysql_real_escape_string () // Ora vogliamo salvarlo nel nostro database $ sql = "INSERIRE INTO prodotti (id, nome, descrizione, prezzo) VALORI ( $ id, '$ nome', '$ descrizione', $ prezzo) "; $ querySuccess = mysql_query ($ sql, $ db);
Come accennato in precedenza, vogliamo archiviare i nostri dati sia nel nostro database MySQL che nel server Memcached. Ecco come procediamo:
// Abbiamo convalidato e disinfettato i nostri dati // Siamo sfuggiti a ogni char rischioso con mysql_real_escape_string () // Ora vogliamo scriverli nel nostro database: $ sql = "INSERIRE I prodotti (id, nome, descrizione, prezzo) VALORI ($ id, '$ name', '$ description', $ price) "; $ querySuccess = mysql_query ($ sql, $ db); // Abbiamo scritto i nostri dati nel nostro database // Ora memorizziamo il nome, la descrizione e il prezzo del prodotto nella nostra cache // Il metodo "set" indica al nostro server Memcached di memorizzare i dati associati a una chiave specifica if ($ querySuccess = == true) // Costruiamo una chiave univoca che possiamo ricostruire più tardi // Useremo la parola 'prodotto' più l'id del nostro prodotto (ad esempio "product_12") $ key = 'product_'. $ Id; // Archiviamo un array associativo contenente i nostri dati di prodotto $ product = array ('id' => $ id, 'name' => $ name, 'description' => $ description, 'price' => $ price); // E chiediamo a Memcached di memorizzare quei dati $ memcache-> set ($ key, $ product);
A questo punto, sia il nostro database che la cache contengono i nostri dati di prodotto.
Nel caso in cui la nostra cache non sia disponibile, vogliamo tornare a MySQL.
Ora recuperiamo i nostri dati. Nello stesso esempio, diciamo che il nostro negozio online ha uno script chiamato Product.php
che visualizza un prodotto specifico. Accesso alla pagina Product.php? id = 12
mostrerà il prodotto il cui identificativo è 12.
Ad un certo punto nel nostro Product.php
codice, eseguiamo a SELEZIONARE
Query SQL il cui scopo è recuperare i dati di un prodotto dal nostro database MySQL. Potrebbe assomigliare a questo:
// Abbiamo convalidato e disinfettato i nostri dati // Siamo sfuggiti a ogni char rischioso con mysql_real_escape_string () // Ora vogliamo leggere dal nostro database: $ sql = "ID SELECT, nome, descrizione, prezzo FROM prodotti WHERE id =" . $ Id; $ queryResource = mysql_query ($ sql, $ db); $ product = mysql_fetch_assoc ($ queryResource);
Come detto sopra, vogliamo recuperare i nostri dati dal nostro server Memcached, se possibile, perché è più veloce che ottenerlo da MySQL. Ma nel caso in cui il nostro server di cache non può essere raggiunto, o se semplicemente non memorizza i dati di cui abbiamo bisogno, vogliamo ricorrere a MySQL. Ecco come procediamo:
// Inizializza la nostra $ product variable $ product = null; // Prima controlliamo che il nostro server cache sia disponibile // La variabile $ cacheAvailable è stata inizializzata quando ci siamo collegati al nostro server cache if ($ cacheAvailable == true) // Costruiamo la chiave che abbiamo associato ai nostri dati di prodotto $ key = 'Prodotto_' . $ Id; // Ora otteniamo i dati dal nostro server cache $ product = $ memcache-> get ($ key); // dobbiamo accedere a MySQL? if (! $ product) // Nel caso in cui lo facciamo ... perché la nostra variabile prodotto $ è ancora nullo // Abbiamo convalidato e disinfettato i nostri dati // Abbiamo evaso ogni carattere rischioso con mysql_real_escape_string () // Ora vogliamo leggere dal nostro database: $ sql = "ID SELECT, nome, descrizione, prezzo FROM prodotti WHERE id =". $ Id; $ queryResource = mysql_query ($ sql, $ db); $ product = mysql_fetch_assoc ($ queryResource);
A questo punto, abbiamo recuperato i dati di cui avevamo bisogno. Probabilmente è stato fatto dalla nostra cache, ma potrebbe essere da MySQL se la cache non è stata riempita o non è stato possibile accedervi per qualche motivo.
Abbiamo visto come Memcached può essere usato per velocizzare il tuo sito web e limitare il carico del tuo database. Il nostro esempio sopra era basato su PHP e MySQL perché queste tecnologie sono ampiamente implementate, ma questo principio è universale e funziona allo stesso modo con molte altre tecnologie: C / C ++, Java, Python, Ruby, Perl, .Net, MySQL, Postgres, Erlang, Lua, Lisp, Cold Fusion, Ocaml e io sono elencati insieme a PHP sul wiki ufficiale di Memcached.
Come ho brevemente menzionato prima, Memcached fornisce più funzionalità rispetto al set semplice e ottiene metodi che abbiamo visto sopra. Due utili funzionalità aggiuntive sono gli aggiornamenti di incremento / decremento e la possibilità di impostare un tempo di scadenza per uno specifico dato memorizzato. Entrambi sono disponibili in PHP, insieme ad alcuni altri, come puoi vedere nella documentazione di Memcache.
Divertiti a implementarlo sui tuoi siti web e goditi il miglioramento delle prestazioni gratuite. Grazie mille per la lettura e per favore fatemi sapere se avete domande nei commenti qui sotto.