Turbolad nettstedet ditt med Memcached

Din siste PHP / MySQL-nettside er endelig online. Og det er kjempebra. Men det er ikke så fort som du vil at det skal være, på grunn av de mange SQL-spørringene som kjører hver gang en side genereres. Og over det har du følelsen av at den ikke skal skalere godt under store belastninger. Og du er mest sannsynlig riktig.

I denne opplæringen vil vi se hvordan du kan forbedre webområdets responsevne betydelig, og hjelpe den å skalere til mange samtidige besøkende ved å implementere et hurtiglag mellom koden og databasen. Den gode nyheten er at det er ganske enkelt, og kan gjøres om noen få minutter!


Presenterer Memcached

Memcached er et høykvalitets data caching system i minnet.

Moderne nettsteder og webapplikasjoner bruker mye data, og det er ikke uvanlig å telle så mange som 20 eller til og med 30 SQL-spørringer i en enkelt sidegenerasjon. Multipliser denne mengden med et stort antall besøkende, og du får ofte en overbelastet database, og sider som tar sekunder som skal genereres og sendes til klienten.

Verktøyet vi skal bruke i dag for å forbedre ytelsen kalles Memcached. Det er et høykvalitets data caching system i minnet. Eller for å si det på en annen måte, et veldig raskt program som kjører på serveren din og bruker en brøkdel av tilgjengelig minne for å lagre en assosiativ rekke data. Du kan spørre Memcached å gjøre to ting:

  • Lagre verdien V med nøkkelen K
  • Hent verdien V lagret med nøkkelen K

Dette ser minimalistisk ut, men det er mye du kan gjøre takket være disse to funksjonene, som vi ser veldig snart. Faktisk kan Memcached gjøre noen flere ting, men de er alle bundet til å lagre eller hente data.

Installere Memcached på moderne Linux distribusjoner er ganske enkelt:

  • Ubuntu: sudo apt-get installer memcached
  • Gentoo: sudo emerge install memcached
  • Rød hatt : sudo yum installere memcached

Når installert, vil Memcached automatisk startes hver gang serveren starter. Du kan angi hvor mye minne som er reservert for Memcached, sammen med andre alternativer, i konfigurasjonsfilen (/etc/memcached.conf). 64 MB er tildelt som standard. Konfigurasjonsfilen inneholder også IP-adressen og porten Memcached vil være bundet til. Standardverdier (127.0.0.1 og 11211) er bra for et standardoppsett.


Få tilgang til Memcached fra PHP

Vi ønsker å lagre og hente data fra PHP-skriptene dine. Dette betyr at vi skal ha en måte å koble til Memcached fra PHP. For det skal vi installere utvidelsen "Memcache" for PHP. Som det er en PECL-utvidelse, er det veldig enkelt å installere med "pecl" ved å skrive følgende kommando:

 sudo pecl installere memcache

Det er to PHP-utvidelser relatert til Memcache: "Memcache" og "Memcached" (merk "d" i den andre). Begge er veldig like, men den første har et mindre fotavtrykk. I denne opplæringen bruker vi lysere Memcache. Når installasjonen er installert, bør denne utvidelsen aktiveres, og Memcache-relaterte funksjoner skal nå være tilgjengelige for PHP-skriptene.


Hvordan virker caching arbeid?

Vårt arbeid her er basert på følgende forutsetninger:

  • henting av data fra databasen tar ressurser (CPU + i / o)
  • å hente data fra databasen tar tid
  • vi henter ofte de samme dataene om og om igjen

Vi ønsker også å lagre våre data på en måte som gjør at vi kan hente det effektivt.

Vanligvis vil vi lagre dataene våre i et vedvarende miljø (f.eks. MySQL-databasen). Men vi vil også lagre dataene våre på en måte som gjør at vi kan hente det effektivt, selv om lagringen ikke er vedvarende. Så til slutt vil vi ha to kopier av våre data : en blir lagret i MySQL og den andre blir lagret i Memcache.

Her er trinnene vi må ta for å få dette til å skje:

  • Hver skriveoperasjon (SQL INSERTs og oppdateringer) vil bli utført i både MySQL og Memcached
  • Hver leseoperasjon (SQL SELECT er) vil bli utført i Memcached, og vil falle tilbake til MySQL i tilfelle feil

På dette punktet ser du sannsynligvis hvilke deler av koden du må modifisere: deler der du skriver data og deler hvor du leser data. Hvis PHP-koden din er godt strukturert, burde du ha pakket inn dataadgangskoden i funksjoner eller - enda bedre klasser. Hvis det er tilfelle, må oppdateringen av nettstedet ditt være veldig fort. Hvis ikke, kan du ha litt mer arbeid.


Koble til vår Cache Server

Først av alt, la oss opprette en forbindelse til vår Memcached-server. Her er koden du bør bruke, tidlig i PHP-skriptene dine:

 // Tilkoblingskonstanter definere ('MEMCACHED_HOST', '127.0.0.1'); define ('MEMCACHED_PORT', '11211'); // Opprettelse av tilkobling $ memcache = ny Memcache; $ cacheAvailable = $ memcache-> koble (MEMCACHED_HOST, MEMCACHED_PORT);

På dette tidspunktet har vi etablert en forbindelse til vår Memcache-server. Det kan ha mislyktes, men vi vet det takk til $ cacheAvailable variabel.


Lagring av data i cachen vår

La oss dykke inn i datalagring. Vi skal ta et eksempel for å gjøre ting klarere - en nettbutikk. Vi har et skript kalt edit_product.php hvis formål er å lagre et produkts data i vår database. Hver av våre produkter har følgende informasjon:

  • id
  • Navn
  • beskrivelse
  • pris

På et tidspunkt i vår edit_product.php kode, kjører vi en SETT INN eller OPPDATER SQL-spørring hvis formål er å skrive dette produktets data til vår MySQL-database. Det kan se slik ut:

 // Vi har validert og sanitisert våre data // Vi har rømt alle risikable karboner med mysql_real_escape_string () // Nå vil vi lagre det i vår database $ sql = "INSERT INTO produkter (id, navn, beskrivelse, pris) VÆRDIER ( $ id, '$ navn', '$ beskrivelse', $ pris) "; $ querySuccess = mysql_query ($ sql, $ db);

Som nevnt ovenfor vil vi lagre dataene våre både i MySQL-databasen og i Memcached-serveren. Her er hvordan vi skal fortsette:

 // Vi har validert og sanitized våre data // Vi har rømt alle risikable karboner med mysql_real_escape_string () // Nå vil vi skrive dem til vår database: $ sql = "INSERT INTO produkter (id, navn, beskrivelse, pris) VÆRDIER ($ id, '$ navn', '$ beskrivelse', $ pris) "; $ querySuccess = mysql_query ($ sql, $ db); // Vi har skrevet dataene våre i vår database // La oss nå lagre produktnavnet, beskrivelsen og prisen i cachen vår // Metoden "sett" forteller at vår Memcached-server lagrer dataene som er knyttet til en bestemt nøkkel hvis ($ querySuccess = == true) // Vi bygger en unik nøkkel som vi kan bygge igjen senere // Vi bruker ordet «produkt» pluss produktets id (f.eks. "product_12") $ key = 'product_'. $ Id; // Vi lagrer en assosiativ array som inneholder produktdata $ product = array ('id' => $ id, 'navn' => $ navn, 'beskrivelse' => $ beskrivelse, 'pris' => $ pris); // Og vi spør Memcached å lagre data $ memcache-> set ($ key, $ product); 

På dette tidspunktet inneholder både vår database og cache våre produktdata.


Henter data fra cachen vår

Hvis cachen vår ikke er tilgjengelig, ønsker vi å falle tilbake til MySQL.

La oss nå hente dataene våre. I samme eksempel, la oss si at vår nettbutikk har et script kalt product.php som viser et bestemt produkt. Tilgang til siden product.php? id = 12 vil vise produktet hvis identifikator er 12.

På et tidspunkt i vår product.php kode, kjører vi a Å VELGE SQL-spørring hvis formål er å hente produktets data fra MySQL-databasen. Det kan se slik ut:

 // Vi har validert og sanitisert våre data // Vi har rømt alle risikable karboner med mysql_real_escape_string () // Nå vil vi lese fra vår database: $ sql = "VELG ID, navn, beskrivelse, pris FRA produkter hvor id =" . $ Id; $ queryResource = mysql_query ($ sql, $ db); $ product = mysql_fetch_assoc ($ queryResource);

Som vi sa ovenfor, vil vi hente dataene fra vår Memcached-server hvis mulig, fordi det er raskere enn å få det fra MySQL. Men hvis cache-serveren ikke kan nås, eller hvis den ikke lagrer dataene vi trenger, vil vi komme tilbake til MySQL. Her er hvordan vi skal fortsette:

 // Initialiser vår $ produktvariabel $ product = null; // Først sjekker vi at bufferen vår er tilgjengelig // $ cacheAvailable-variabelen ble initialisert når vi koblet til hurtigbufferen vår hvis ($ cacheAvailable == true) // Vi bygger nøkkelen vi knyttet til produktdataene våre $ key = 'product_'. $ Id; // Nå får vi dataene fra hurtigbufferen vår $ product = $ memcache-> get ($ key);  // trenger vi tilgang til MySQL? hvis (! $ produkt) // I tilfelle vi gjør ... fordi vår $ produktvariabel fortsatt er null // Vi har validert og sanitized våre data // Vi har rømt alle risikable karboner med mysql_real_escape_string () // Nå vil vi lese fra vår database: $ sql = "VELG ID, navn, beskrivelse, pris FRA produkter hvor id =". $ Id; $ queryResource = mysql_query ($ sql, $ db); $ product = mysql_fetch_assoc ($ queryResource); 

På dette tidspunktet har vi hentet dataene vi trengte. Det var mest sannsynlig gjort fra cachen vår, men kan være fra MySQL hvis cachen ikke var fylt eller ikke kunne nås av en eller annen grunn.


Konklusjon

Vi har sett hvordan Memcached kan brukes til å øke hastigheten på nettstedet ditt og begrense databladbelastningen. Vårt eksempel ovenfor var basert på PHP og MySQL fordi disse teknologiene er utbredt, men dette prinsippet er universelt og fungerer akkurat det samme med mange andre teknologier: C / C + +, Java, Python, Ruby, Perl,. Nett, MySQL, Postgres, Erlang, Lua, Lisp, Cold Fusion, Ocaml og Io er oppført sammen med PHP på den offisielle Memcached wiki.

Som jeg kort nevnte tidligere, gir Memcached flere funksjoner enn det enkle settet og får metoder vi har sett ovenfor. To nyttige tilleggsfunksjoner er inkrement / dekningsoppdateringer, og muligheten til å angi en utløpstid til en bestemt lagret data. Begge er tilgjengelige i PHP, sammen med noen få andre, som du kan se i Memcache-dokumentasjonen.

Ha det gøy å implementere dette på websidene dine, og nyt forbedringen -fri ytelse. Takk så mye for å lese og vennligst gi meg beskjed hvis du har noen spørsmål i kommentarene nedenfor.