Turbocharge site-ul dvs. cu Memcached

Ultimul dvs. site PHP / MySQL este în sfârșit online. Și e minunat. Dar nu este atât de rapidă cum doriți să fie, din cauza multor interogări SQL care rulează de fiecare dată când este generată o pagină. Și mai presus de toate, aveți senzația că nu se va schimba bine sub sarcini grele. Și probabil că aveți dreptate.

În acest tutorial, vom vedea cum vă puteți îmbunătăți considerabil capacitatea de reacție a site-ului dvs. și îl puteți ajuta să se ocupe de multe vizitatori simultani, prin implementarea unui strat de cache între codul dvs. și baza de date. Vestea bună este că este destul de ușor și se poate face în câteva minute!


Introducerea Memcached

Memcached este un sistem de caching de date în memorie de înaltă performanță.

Site-urile moderne și aplicațiile web utilizează o mulțime de date și nu este neobișnuit să numărați până la 20 sau chiar 30 de interogări SQL într-o singură generație de pagini. Multiplicați această sumă cu un număr mare de vizitatori și adesea obțineți o bază de date supraîncărcată, iar paginile care au nevoie de secunde pentru a fi generate și trimise clientului.

Instrumentul pe care îl vom folosi astăzi pentru a îmbunătăți performanța este numit Memcached. Este un sistem de caching de date în memorie de înaltă performanță. Sau să o puneți într-un alt mod, o aplicație foarte rapidă care rulează pe serverul dvs. și utilizează o fracțiune din memoria disponibilă pentru a stoca o matrice asociativă de date. Poți să-l întrebi pe Memcached să facă două lucruri:

  • Stocați valoarea V cu cheia K
  • Extrageți valoarea V stocate cu cheia K

Acest lucru pare minimalist, dar aveți multe de făcut datorită acestor două caracteristici, așa cum vom vedea foarte curând. De fapt, Memcached poate face mai multe lucruri, dar toate sunt legate de stocarea sau recuperarea datelor.

Instalarea Memcached pe distribuțiile moderne Linux este destul de simplă:

  • Ubuntu: sudo apt-get instala memcached
  • Gentoo: sudo emerge instala memcached
  • Palarie rosie : sudo yum install memcached

Odată instalat, Memcached va fi pornit automat de fiecare dată când boot-ul dvs. de server. Puteți seta cantitatea de memorie rezervată pentru Memcached, împreună cu alte opțiuni, în fișierul de configurare (/etc/memcached.conf). 64Mb este alocat implicit. Fișierul de configurare conține, de asemenea, adresa IP și portul Memacached va fi obligat. Valori implicite (127.0.0.1 și 11211) sunt bine pentru o configurație standard.


Accesarea Memcached din PHP

Vrem să stocăm și să preluăm date din scripturile dvs. PHP. Aceasta înseamnă că vom avea nevoie de o modalitate de conectare la Memcached din PHP. Pentru aceasta, vom instala extensia "Memcache" pentru PHP. Deoarece este o extensie PECL, este foarte ușor de instalat cu "pecl" tastând următoarea comandă:

 sudo pecl install memcache

Există două extensii PHP legate de Memcache: "Memcache" și "Memcached" (observați "d" în cel de-al doilea). Ambele sunt foarte asemănătoare, dar prima are o amprentă mai mică. În acest tutorial, vom folosi Memcache mai ușor. Odată instalat, această extensie ar trebui activată, iar funcțiile legate de Memcache ar trebui să fie acum disponibile pentru scripturile dvs. PHP.


Cum funcționează Caching-ul?

Activitatea noastră aici se bazează pe următoarele ipoteze:

  • preluarea datelor din baza de date ia resurse (CPU + i / o)
  • preluarea datelor din baza de date necesită timp
  • deseori recuperăm aceleași date de mai multe ori

De asemenea, dorim să stocăm datele noastre într-un mod care să ne permită să îl preluăm eficient.

În general, vrem să salvăm datele într-un mediu persistent (de exemplu, baza noastră de date MySQL). Dar, de asemenea, dorim să stocăm datele noastre într-un mod care ne permite să îl preluăm eficient, chiar dacă stocarea este non-persistentă. Așa că, în final, vom avea două copii ale datelor noastre : unul fiind stocat în MySQL, iar celălalt stocat în Memcache.

Iată pașii pe care trebuie să le luăm pentru a face acest lucru:

  • Fiecare operație de scriere (SQL Fragmentelor și aCTUALIZĂRI) va fi efectuată în ambele MySQL și Memcached
  • Fiecare operație de citire (SQL SELECTS) va fi efectuată în Memcached și va reveni la MySQL în caz de eroare

În acest moment, probabil veți vedea care părți ale codului dvs. trebuie modificate: părți în care scrieți date și părți în care citiți date. În cazul în care codul dvs. PHP este bine structurat, ar fi trebuit să vă împachetați codul de acces la date în funcții sau chiar mai clare. Dacă da, actualizarea site-ului dvs. ar trebui să fie foarte rapidă. Dacă nu, s-ar putea să ai puțină muncă.


Conectarea la Serverul nostru de Cache

Mai întâi, să creăm o conexiune la serverul Memcached. Aici este codul pe care ar trebui să-l utilizați, la începutul scripturilor dvs. PHP:

 // define constantele conexiunii ('MEMCACHED_HOST', '127.0.0.1'); define ('MEMCACHED_PORT', '11211'); // Crearea conexiunii $ memcache = Memcache nou; $ cacheAvailable = $ memcache-> conectare (MEMCACHED_HOST, MEMCACHED_PORT);

În acest moment, am stabilit o conexiune la serverul Memcache. Poate că a eșuat, dar știm foarte mult datorită $ cacheAvailable variabil.


Stocarea datelor în memoria cache

Să ne aruncăm cu capul în stocarea datelor. Vom lua un exemplu pentru a face lucrurile mai clare - un magazin online. Avem un script numit edit_product.php al cărui scop este de a salva datele unui produs în baza noastră de date. Fiecare dintre produsele noastre are următoarele informații:

  • id
  • Nume
  • Descriere
  • Preț

La un moment dat în nostru edit_product.php cod, conducem un INTRODUCE sau ACTUALIZAȚI Interogare SQL al cărei scop este de a scrie datele acestui produs în baza noastră de date MySQL. Ar putea arata exact asa:

 // Am validat și dezinfectat datele noastre // Am scăpat orice caracter riscant cu mysql_real_escape_string () // Acum vrem să îl salvăm în baza noastră de date $ sql = "INSERT INTO produse (id, nume, descriere, preț) VALORI ( $ id, '$ name', '$ description', $ price) "; $ querySuccess = mysql_query ($ sql, $ db);

După cum am menționat mai sus, dorim să stocăm datele atât în ​​baza de date MySQL, cât și în serverul Memcached. Iată cum vom proceda:

 // Am validat și dezinfectat datele noastre // Am scăpat orice caracter riscant cu mysql_real_escape_string () // Acum vrem să le scriem în baza noastră de date: $ sql = "INSERT INTO produse (id, nume, descriere, preț) VALORI ($ id, '$ name', '$ description', $ price) "; $ querySuccess = mysql_query ($ sql, $ db); // Am scris datele noastre în baza noastră de date // Acum să stocăm numele, descrierea și prețul produsului în cache-ul nostru // Metoda "set" indică serverului Memcached să stocheze datele asociate unei anumite chei dacă ($ querySuccess = == true) // Construim o cheie unică pe care o putem construi mai târziu // Vom folosi cuvântul "produs" plus id-ul produsului nostru (de ex. "product_12") $ key = 'product_'. $ Id; // Stocăm o matrice asociativă care conține datele produselor noastre $ product = array ('id' => $ id, 'name' => $ name, 'description' => $ description, 'price' => $ price); // Și cerem Memcached să stocheze acele date $ memcache-> set ($ key, $ product); 

În acest moment, baza noastră de date și memoria cache conțin datele despre produse.


Preluarea datelor din memoria cache

În cazul în care cache-ul nostru nu este disponibil, vrem să revenim la MySQL.

Acum să ne recuperăm datele. În același exemplu, să spunem că magazinul nostru online are un script numit product.php care afișează un produs specific. Accesarea paginii product.php? id = 12 va afișa produsul al cărui identificator este 12.

La un moment dat în nostru product.php cod, executăm un SELECTAȚI Interogare SQL al cărei scop este de a prelua datele unui produs din baza de date MySQL. Ar putea arata exact asa:

 // Am validat și dezinfectat datele noastre // Am scăpat orice caracter riscant cu mysql_real_escape_string () // Acum dorim să citim din baza noastră de date: $ sql = "SELECT id, nume, descriere, preț FROM PRODUCTS WHERE id =" . $ Id; $ queryResource = mysql_query ($ sql, $ db); $ product = mysql_fetch_assoc ($ queryResource);

După cum am spus mai sus, dorim să preluăm datele noastre de pe serverul Memcached, dacă este posibil, deoarece este mai rapid decât obținerea de la MySQL. Dar în cazul în care serverul nostru de cache nu poate fi atins sau dacă nu stochează pur și simplu datele de care avem nevoie, vrem să revenim la MySQL. Iată cum vom proceda:

 // Inițializați variabila produsului $ $ product = null; // Mai întâi verificăm dacă serverul nostru de cache este disponibil // Variabila $ cacheAvailable a fost inițializată când ne-am conectat la serverul nostru de cache dacă ($ cacheAvailable == true) // Construim cheia pe care am asociat-o produsului nostru $ key = 'produs_' . $ Id; // Acum primim datele din serverul nostru cache $ product = $ memcache-> get ($ key);  // trebuie să accesăm MySQL? dacă (! $ product) // În cazul în care vom face ... deoarece variabila noastră de produs $ este încă null // Am validat și dezinfectat datele noastre // Am scăpat orice caracter riscant cu mysql_real_escape_string () // Acum vrem să citim din baza noastră de date: $ sql = "SELECT id, nume, descriere, preț FROM PRODUCTS WHERE id =". $ Id; $ queryResource = mysql_query ($ sql, $ db); $ product = mysql_fetch_assoc ($ queryResource); 

În acest moment, am recuperat datele de care aveam nevoie. Acesta a fost cel mai probabil făcut din cache-ul nostru, dar ar putea fi de la MySQL dacă cache-ul nu a fost umplut sau nu a putut fi accesat dintr-un motiv.


Concluzie

Am văzut cum poate fi folosit Memcached pentru a vă grăbi site-ul și pentru a limita încărcarea bazei dvs. de date. Exemplul nostru de mai sus a fost bazat pe PHP si MySQL deoarece aceste tehnologii sunt larg implementate, dar acest principiu este universal si functioneaza la fel cu multe alte tehnologii: C / C ++, Java, Python, Ruby, Perl, .Net, MySQL, Postgres, Erlang, Lua, Lisp, Cold Fusion, Ocaml și io sunt listate împreună cu PHP pe wiki-ul oficial Memcached.

Așa cum am menționat mai devreme, Memcached oferă mai multe caracteristici decât setul simplu și să obținem metodele pe care le-am văzut mai sus. Două caracteristici suplimentare utile sunt actualizările de creșteri / reduceri și capacitatea de a seta un timp de expirare la anumite date stocate. Ambele sunt disponibile în PHP, alături de altele, după cum puteți vedea în documentația Memcache.

Distrează-te de punerea în aplicare a acestui lucru pe site-urile dvs. web și bucurați-vă de îmbunătățirea performanțelor. Vă mulțumesc foarte mult pentru citire și vă rog să-mi spuneți dacă aveți întrebări în comentariile de mai jos.

Cod