Programos pavyzdys PHP. „Memcache“ naudojimas su PHP Php atminties talpyklos pavyzdžiais

Šis straipsnis yra „Pirmosios pagalbos“ pobūdžio. Išsamus konkrečių veiksmų, leidžiančių įdiegti ir konfigūruoti „memcached“ serveryje, aprašymas.

Pradėkime nuo apibrėžimo.

Atmintinė- programinė įranga, kuri įdiegia duomenų talpyklos paslaugą RAM pagal maišos lentelę.

Pradiniai duomenys:

  • VPS veikia operacinėje sistemoje Debian;
  • galiojančią svetainę, kurią galima pasiekti per FTP, SSH.

Pradėkime nuo paskutinio punkto. Veikiančio interneto šaltinio (ar kažko panašaus) dėka galime greitai ir lengvai sužinoti, ką įdiegėme (be kita ko, galbūt rasime atmintinę). Sukurkime failą info.php, kuriame įrašysime:

Paleiskite kodą apsilankę http://example.com/info.php:

Jei be viso kito rasite panašų įrašą, vadinasi, viskas tvarkoje ir darbas jau atliktas. Priešingu atveju gausime šį rezultatą pagal šiame leidinyje aprašytus veiksmus.

„Memcached“ serverio diegimas

Pradėkime diegimą su komanda

Apt-get install memcached php5-memcache

Laukiame, kol baigsis diegimas. Tada patikrinsime rezultatus su komanda netstat

Rezultate gauname:

Tcp 0 0 *:11211 *:* KLAUSYTI 13053/atmintinė

Kaip matome, pagal nutylėjimą „memcached“ „klauso“ prievado 11211. Todėl per šį prievadą kiekvienas gali prisijungti ir naudoti mūsų atmintinėje išsaugotą serverį. Apsaugokime save, suteikdami šią teisę tik savo serveriui (localhost). Atidarykite /etc/memcached.conf failą naudodami valdymo skydelį arba konsolę:

Vi /etc/memcached.conf

Šiame faile yra išsamių komentarų. Būtinai juos patikrinkite.

Pridėkite eilutę -l 127.0.0.1 .

Iš naujo paleiskite atmintyje įrašytą serverį naudodami komandą:

/etc/init.d/memcached paleisti iš naujo

Ir dar kartą patikrinkime:

Netstat -tap | grep atmintyje

Dėl to turėtume gauti kažką panašaus

Tcp 0 0 localhost.localdo:11211 *:* KLAUSYTI 13092/memcached

Dabar „memcached“ veikia tik vietiniame serveryje.

„Memcache“ diegimas

Komandų sąrašas (memcache versija gali skirtis!):

Apt-get install php5-dev libmemcache-dev pecl atsisiųsti memcache tar xzvf memcache-2.2.6.tgz cd memcache-2.2.6/ phpize && ./configure --enable-memcache && make cp modules/memcache.so /usr/ lib/php5/20060613/ echo "extension=memcache.so" >> /etc/php5/apache2/php.ini

Iš naujo paleiskite „Apache“:

Apachectl grakštus

Patikrinkime scenarijų, kurį anksčiau paskelbėme adresu http://example.com/info.php. Dabar ten turėtume rasti elementą „Memcache“.

Patikrinkime „Memcached“ veikimą

Sukurkime result.php failą ir paleiskite jį.

connect("localhost", 11211) arba exit("Nepavyko prisijungti prie atmintinės talpyklos serverio"); $versija = $memcache->getVersion(); echo "Serverio versija: ".$version."
\n"; $tmp_object = new stdClass; $tmp_object->str_attr = "testas"; $tmp_object->int_attr = 123; $memcache->set("raktas", $tmp_object, false, 10) arba miršta ("Ne" Man pavyko palikti įrašą „Memcached“); aidas „Rašome duomenis į „Memcached“ talpyklą (duomenys bus saugomi 10 sekundžių)
\n"; $get_result = $memcache->get("key"); echo "Duomenys įrašyti į atminties talpyklą:
\n"; var_dump($gauti_rezultatą); ?>

Scenarijaus rezultatas:

Serverio versija: 1.4.13 Įrašykite duomenis į atmintinės talpyklą (duomenys bus saugomi 10 sekundžių) Duomenys, įrašyti į atminties talpyklą: object(stdClass)#3 (2) (["str_attr"]=> string(4) "testas" ["int_attr"]=> int(123) )

Ar viskas taip ar beveik taip? Tada viskas gerai. Jei ne, pabandykite pakartoti procedūras.

„Memcache“ modulis suteikia patogias procedūrines ir į objektus orientuotas sąsajas atmintinės talpyklos varikliui. „Memcache“ yra labai efektyvus talpyklos demonas, specialiai sukurtas sumažinti duomenų bazės apkrovą didelės apkrovos dinamiškoms žiniatinklio programoms.

„Memcache“ modulyje taip pat yra seansų tvarkytuvas. Daugiau informacijos apie „Memcached“ rasite adresu memcached.org

Iš esmės diegimo ir konfigūracijos aprašymas rusų kalba jau paruoštas ir galite su juo susipažinti.

Turėkite omenyje, kad talpykloje galite saugoti bet kokio tipo duomenis: kintamuosius, objektus ir masyvus, BET NE IŠTEKLIAI!

Jei kokiame nors objekte yra ypatybė – išteklius, pavyzdžiui, ryšys su duomenų baze, arba yra kitas objektas su panašiomis savybėmis, tada ši situacija turi būti sprendžiama atskirai, pavyzdžiui, nepaisant __sleep() metodo, kuriame šiam ištekliui reikia būti „nužudytam“ ir __wakeup metodą (), kurio metu šį išteklį reikia atgaivinti.

Tiesą sakant, visus šiuos metodus galima suskirstyti į 3 grupes:

  1. Darbas su vertybėmis
  2. Darbas su serveriais ir ryšiais
  3. Informacijos gavimas

Darbas su vertybėmis

Šios grupės metodai leidžia atlikti šiuos veiksmus:

  • Nustatykite vertes
  • Ištrinkite šias reikšmes
  • Pakeiskite šias reikšmes
  • Pasiekite šias reikšmes naudodami raktą
  • Valdykite vertę visą gyvenimą

Keletas specifinių sveikųjų skaičių reikšmių didinimo ir mažinimo metodų.

Atmintinė::set()
Atmintinė::add()

Leidžia nustatyti šios vertės vertę, glaudinimą ir veikimo laiką. Vienintelis šių metodų veikimo skirtumas yra tas, kad metodas Memcache::add grąžins FALSE, jei jau nustatyta reikšmė su tuo pačiu raktu.

bool Atmintinė::add
bool Memcache::set(eilutė $key , mišrus $var [, int $flag [, int $galiojimo laikas ]])

  • string $key yra reikšmės raktas, naudodamiesi ja apdorojame reikšmę.
  • mišrus $var – vertė.
  • konstantos
connect("localhost", 11211, 30); $cache->add("mano pirmas", 1000, MEMCACHE_COMPRESSED, 15); $cache->set("mysecond", 2000, MEMCACHE_COMPRESSED, 15);

Atmintinė::get()

Grąžina prašomą reikšmę arba FALSE, jei nepavyko, arba jei reikšmė su tuo raktu dar nenustatyta.

Galite perduoti verčių raktų masyvą, tada Memcache::get taip pat grąžins masyvą, kuriame bus rastos raktų ir reikšmių poros.

Įspėjimai!

Jei rakto pavadinime yra pasvirasis brūkšnys, tada darbo rezultatai bus nenuspėjami!

„Memcached“ taip pat turi tam tikrų problemų: remiantis kai kuriomis ataskaitomis, ji (kartais) linkę į buferio perpildymo klaidas, dėl kurio retkarčiais perrašomi [daliniai] duomenys ir dėl to neįmanoma deserializuoti struktūrų, būtinai patikrinkite, ar Memcache::get grąžina bool, dobule arba long dėl masyvo ar objekto gavimo, tada kažkas nutiko.

styga Memcache::get(eilutė $key [, int &$flags ])
masyvas Memcache::get(masyvas $keys [, masyvas &$flags ])

  • eilutė $key - reikšmės raktas arba raktų, kurių reikšmes reikia gauti, masyvas.
  • int $ vėliavėlė – šio parametro paskirtis man lieka paslaptis. Bandžiau naudoti kai kurias sveikųjų skaičių reikšmes, bet tai neturėjo jokio poveikio. O pavyzdžiai dažniausiai pateikiami jo nenaudojant, iš to padariau išvadą: be jo galima puikiai dirbti :)
connect("localhost", 11211, 30); $cache->add("mano pirmas", 1000, MEMCACHE_COMPRESSED, 15); $cache->set("mysecond", 2000, MEMCACHE_COMPRESSED, 15); print_r($cache->get(array("manopirmasis","manosekundis")));

Rezultatas:

Masyvas (=> 1000 => 2000)

Atmintis::delete()

Pašalinkite reikšmę iš talpyklos.

komentaras:

Šis metodas ne visada veikia (priklauso nuo programinės įrangos versijos)! Puslapio pabaigoje yra atvejų, kai Memcache::delete veikia, o kada ne.

Na, vienintelė stabili galimybė yra iš naujo nustatyti nereikalingas reikšmes:

$cache->set("trys", NULL);

Yra tik vienas minusas - raktas šiuo atveju niekur nedingsta

styga Atmintinė:: ištrinti(eilutė $key [, int $timeout = 0 ])

  • string $key – rakto reikšmė, kurią reikia ištrinti.
  • int $timeout – šis parametras taip pat pasenęs ir nepalaikomas, numatytasis 0 sekundžių. Nenaudokite šios parinkties.

Atmintinė::pakeisti()

Perrašyti esamą vertę.

Pakeisti turėtų būti naudojama „Memcache::replace()“. esamą vertę. Jei reikšmės su tokiu raktu neegzistuoja, Memcache::replace() grąžina FALSE. Kitu atveju Memcache::replace() veikia taip pat kaip Memcache::set(). Taip pat galite naudoti funkciją memcache_replace().

styga Atmintinė::pakeiskite(eilutė $key , mišrus $var [, int $flag [, int $galiojimo laikas ]])

  • string $key – raktas, kurio reikšmę reikia pakeisti.
  • mišrus $var – nauja vertė.
  • int $ vėliavėlė – žyma, nurodanti, ar saugomai reikšmei naudoti suspaudimą (čia atsiranda Zlib), galima naudoti konstantas
  • int $galiojimo laikas – vertės galiojimo laikas (talpykla). Jei lygus nuliui, tai neribotą laiką. Taip pat galite naudoti laiko žymą arba sekundžių skaičių nuo dabartinio laiko, bet tada sekundžių skaičius negali viršyti 2592000 (30 dienų).
connect("localhost", 11211, 30); $cache->add("vienas", 111, 0, 15); $cache->add("du", 222, 0, 15); $cache->add("trys", 333, 0, 15); $cache->replace("trys", 777); print_r($cache->get(array("vienas","du","trys"))); Masyvas ( => 111 => 222 => 777)

Atmintis::increment()

Padidina nurodyto rakto reikšmę nurodyta reikšme. Jei nurodyto rakto reikšmė nėra skaitinė ir jos negalima konvertuoti į skaičių, jis pakeis savo reikšmę į reikšmę, nurodytą kaip antrasis parametras. Memcache::increment() nesukuria elemento, jei jo dar nėra.

Nerekomenduojama naudoti Memcache::increment() su suglaudintomis reikšmėmis (nustatyta MEMCACHE_COMPRESSED vėliava), nes vėliau bus netikėtumų, kai bandysite gauti šias reikšmes naudodami Memcache::get()

Asmeniškai patikrinau ir jokių nesklandumų nepastebėjau :)

tarpt Atmintinė::prieaugis

  • string $key – raktas, kurio reikšmę reikia didinti.
  • int $value – vertės padidėjimas.
connect("localhost", 11211, 30); $cache->set("someOne", 10, 0, 5); $cache->increment("someOne", 10, 0, 5); $cache->increment("someOne", 10, 0, 5); echo $cache->get("someOne");// išspausdins 30

Atmintis::decrement()

Sumažina nurodyto rakto vertę nurodyta reikšme. Panašiai kaip Memcache::increment(), dabartinė elemento reikšmė konvertuojama į skaitinę reikšmę ir sumažinama

tarpt Atmintinė::mažėjimas(eilutė $key [, int $value = 1 ])

  • string $key – raktas, kurio reikšmę reikia sumažinti.
  • int $value – vertės mažinimas.

Atmintis::flush()

Memcache::flush() panaikina visas esamas reikšmes. Memcache::flush() iš tikrųjų neatlaisvina atminties išteklių, ji tik pažymi visus elementus kaip pasenusius, kad užimta atmintis būtų prieinama naujoms reikšmėms. Taip pat galite naudoti funkciją memcache_flush().

bool Memcache::flush(tuštuma)

Toliau pateiktame pavyzdyje nieko nebus.

connect("localhost", 11211, 30); $cache->set("someOne", 111, 0, 5); $cache->set("someTwo", 222, 0, 5); $cache->set("someTree", 333, 0, 5); $cache->flush(); //Išvalo talpyklą print_r($cache->get(array("someOne","someTwo","someTree")));

Darbas su serveriais ir ryšiais.

„Memcache“ gali dirbti su vienu serveriu arba serverių telkiniu (rinkiniu).

Jei talpyklai aptarnauti naudojate tik vieną serverį, norint inicijuoti darbą, tereikės sukurti talpyklos objektą ir naudoti metodą Memcache::connect

Jei ketinate sukurti serverių telkinį, pirmiausia turėsite sukurti talpyklos objektą, o tada naudoti Memcache::addServer pridėkite prie jo reikiamą skaičių serverių.

Atmintinė::connect()

Užmezga ryšį su „Memcached“ serveriu. Ryšys, kuris buvo atidarytas naudojant Memcache::connect(), bus automatiškai uždarytas, kai scenarijus bus baigtas, bet galite jį uždaryti tiesiogiai naudodami Memcache::close(). Taip pat galite naudoti funkciją memcache_connect(). Sėkmingai grąžina TRUE arba klaidą FALSE.

bool Memcache::connect

connect("localhost", 11211, 30);

Atmintinė::pconnect()

Šis metodas yra panašus į Memcache::connect(), vienintelis skirtumas yra tas, kad jis sukuria nuolatinį ryšį. Šis ryšys neuždaromas, kai scenarijus baigiamas ir iškviečiama Memcache::close(). Taip pat galite naudoti funkciją memcache_pconnect(). Sėkmingai grąžina Memcache objektą arba klaidos atveju FALSE.

sumaišytas Memcache::pconnect(eilutė $host [, int $port [, int $timeout ]])

  • Šis parametras taip pat gali nurodyti kitus transportus, pvz., unix:///path/to/memcached.sock, t.y. naudokite UNIX lizdus, ​​tokiu atveju prievadas turi būti nustatytas į 0.
  • Nustatykite šį parametrą į 0, jei ketinate naudoti lizdus.
  • int $timeout – prisijungimo prie demono sekundės apribojimas. Prieš keisdami numatytąją 1 sekundės reikšmę, gerai pagalvokite – jei ryšys užtruks per ilgai, galite prarasti visus talpyklos privalumus.
pconnect("localhost", 11211, 30);

Atmintis::close()

Uždaromas ryšys su „Memcached“ serveriu. Ši funkcija neuždaro nuolatinių ryšių, kurie uždaromi tik išjungus / iš naujo paleidus žiniatinklio serverį. Taip pat galite naudoti funkciją memcache_close().

bool Atmintinė:: uždaryti(tuštuma)

Atmintinė::addServer()

Prideda serverį į ryšių telkinį. Ryšys, kuris buvo atidarytas naudojant Memcache::addServer(), bus automatiškai uždarytas, kai scenarijus bus baigtas, arba galite jį uždaryti rankiniu būdu naudodami Memcache::close(). Galite naudoti funkciją memcache_add_server().

Naudojant „Memcache::addServer“ (priešingai nei „Memcache::connect()“ ir „Memcache::PConnect()), tinklo ryšys neužmezgamas tol, kol jo tikrai nereikia. Tokiu būdu, pridedant daug serverių į baseiną, net jei jie visai nereikalingi, nereikia papildomų išlaidų.

Serverio telkinys užtikrina didesnį atsparumą gedimams. Bet kokios lizdo klaidos arba serverio lygio atmintinės klaidos (išskyrus atminties klaidas) sukelia išteklių perskirstymą. Kliento klaidos, pavyzdžiui, pridėjus esamą raktą, nesukels gedimų.

komentaras:

Sėkmingai grąžina TRUE arba klaidą FALSE.

bool Memcache::addServer(eilutė $host [, int $port = 11211 [, bool $persistent [, int $svoris [, int $timeout [, int $retry_interval [, bool $status [, iškviečiamas $failure_callback [, int $timeoutms ]]]]] ]]]])

  • eilutė $host – talpykloje išsaugotas pagrindinis kompiuteris. Šis parametras taip pat gali nurodyti kitus transportus, pvz., unix:///path/to/memcached.sock, t.y. naudokite UNIX lizdus, ​​tokiu atveju prievadas turi būti nustatytas į 0.
  • int $port – prievadas, kuriame „Memcached“ klausosi jungčių. Nustatykite šį parametrą į 0, jei ketinate naudoti lizdus.
  • bool $persistent – ​​nustato nuolatinio ryšio naudojimą. Pagal numatytuosius nustatymus TRUE.
  • int $weight – kuo didesnė reikšmė, tuo didesnė tikimybė, kad šis serveris bus pasirinktas reikšmėms saugoti. Tie. tai yra tam tikras serverio „svoris“ bendrame telkinyje, netiesiogiai tai yra ir numatoma serverio apkrova.
  • int $timeout – prisijungimo prie demono sekundės apribojimas. Prieš keisdami numatytąją 1 sekundės reikšmę, gerai pagalvokite – jei ryšys užtruks per ilgai, galite prarasti visus talpyklos privalumus.
  • eilutė $timeoutms – neaprašyta.

Informacijos gavimas

Atmintinė::getExtendedStats()

Pateikia dvimatį, asociatyvų serverio statistikos masyvą. Serverio host:port raktų masyvas. Vertybėse yra atskiri statistikos parametrai. Sugedusių serverių reikšmė FALSE. Taip pat galite naudoti funkciją memcache_get_extended_stats()

komentaras:

Ši funkcija buvo įtraukta į „Memcache“ 2.0.0 versijoje

masyvas Memcache::getExtendedStats([ string $type [, int $slabid [, int $limit = 100 ]]])

O dabar pokštas:

„Cachedump“ statistikos tipas buvo pašalintas iš „Memcached“ saugumo sumetimais

Informacijos išvedimo pavyzdys (skambutis be parametrų):

Masyvas (=> masyvas (=> 5179 => 966862 => 1336505233 => 1.4.5 => 64 => 160.302880 => 483.975109 => 6 => 358080 => 13 => 15037476 => 3501979 1507898 => 3529578 => 0 => 0 => 0 => 76 => 0 => 0 => 0 => 0 => 0 => 0 => 0 => 1643906080 => 11298732744 => 671 = 8 = 46 > 0 => 4 => 0 => 3295454 => 7623 => 3501915 => 0 => 1825755) ...)

Atminties talpykla::getServerStatus()

Grąžina serverio prisijungimo / neprisijungimo būseną. Taip pat galite naudoti funkciją memcache_get_server_status()

komentaras:

Ši funkcija buvo įtraukta į „Memcache“ 2.0.0 versijoje

tarpt Atminties talpykla::getServerStatus(eilutė $host [, int $port = 11211 ])

  • eilutė $host – talpykloje išsaugotas pagrindinis kompiuteris.
  • int $port – prievadas, kuriame „Memcached“ klausosi jungčių.

Atmintinė::getStats()

Pateikia asociatyvų masyvą su serverio statistika. Raktų masyvas, atitinkantis statistinius parametrus ir parametro vertės reikšmes. Taip pat galite naudoti funkciją memcache_get_stats()

masyvas Atmintinė::getStats s ([ string $type [, int $slabid [, int $limit = 100 ]]])

  • string $type – statistikos tipas. Galiojančios reikšmės: (atstatyti, malloc, žemėlapiai, talpyklos talpa, plokštės, elementai, dydžiai). Remiantis „Memcached“ protokolo specifikacija, šie papildomi argumentai „gali būti modifikuoti kūrėjų patogumui“.
  • int $slabid – naudojamas, kai pirmasis parametras nustatytas į "cachedump" nurodo serverį, kuris bus naudojamas derinimui.
  • int $limit – naudojamas, kai pirmasis parametras nustatytas į "cachedump", kad būtų apribotas įrašų skaičius iškeltoje.

Atmintinė::getVersion()

Grąžina eilutę – serverio versijos numerį. Taip pat galite naudoti funkciją memcache_get_version().

styga Atminties talpykla::getVersion(tuštuma)

Atmintinė::setCompressThreshold()

Užtikrina automatinį didelių verčių suspaudimą. Taip pat galite naudoti funkciją memcache_set_compress_threshold()

komentaras:

Ši funkcija buvo įtraukta į „Memcache“ 2.0.0 versijoje

bool Memcache::setCompressThreshold(int $ slenkstis [, float $min_savings ])

  • int $slenkstis – mažiausias vertės, kurią reikia automatiškai suspausti, ilgis.
  • float $min_savings – nustato suspaudimo laipsnį. Nurodyta reikšmė turi būti nuo 0 iki 1. Numatytoji reikšmė yra 0,2, o tai leidžia sutaupyti mažiausiai 20 %.

Atmintinė::setServerParams()

Vykdymo metu keičiami serverio parametrai. Taip pat galite naudoti funkciją memcache_set_server_params().

Sėkmingai grąžina TRUE arba klaidą FALSE.

komentaras:

Ši funkcija buvo įtraukta į „Memcache“ 2.0.0 versijoje

bool Memcache::setServerParams(eilutė $host [, int $port = 11211 [, int $timeout [, int $retry_interval = false [, bool $status [, callable $failure_callback ]]]]])

  • eilutė $host – talpykloje išsaugotas pagrindinis kompiuteris.
  • int $port – prievadas, kuriame „Memcached“ klausosi jungčių.
  • int $timeout – prisijungimo prie demono sekundės apribojimas. Prieš keisdami numatytąją 1 sekundės reikšmę, gerai pagalvokite – jei ryšys užtruks per ilgai, galite prarasti visus talpyklos privalumus.
  • int $retry_interval – nustato, kaip dažnai bus apklausiamas sugedęs serveris, numatytoji reikšmė yra 15 sekundžių. Nustačius šį parametrą į -1, išjungiamas automatinis pakartotinis užklausų bandymas.
  • bool $status – pažymi serverį kaip ONLINE. Nustačius šį parametrą į FALSE ir retry_interval -1, nepavykusį serverį galima laikyti aktyvių serverių telkinyje, kad nebūtų paveikti raktų paskirstymo algoritmai. Užklausos šiam serveriui bus paskirstytos tarp likusių galimų serverių. Numatytoji reikšmė yra TRUE, o tai reiškia, kad serveris turėtų būti PRISIJUNGTAS.
  • callable $failure_callback – leidžia vartotojui nurodyti atgalinio skambučio funkciją, kuri būtų paleista, kai aptinkama klaida. Funkcija turi turėti du parametrus: sugedusio serverio pagrindinio kompiuterio pavadinimą ir prievadą.

Straipsnis pradedantiesiems. „Memcached“ yra duomenims talpykloje saugoti serverio RAM.

Kokia prasmė? Svetainė paprastai paima duomenis iš duomenų bazės, o duomenų bazė yra didelis failas diske, o nuskaitymas iš disko a priori vyksta lėčiau nei iš atminties. Tai ima ryškėti ne iš karto – kai tik lankomumas viršija kelias dešimtis tūkstančių žmonių, o lentelės duomenų bazėje išauga iki šimtų tūkstančių eilučių. Be to, pati duomenų bazė pagal apibrėžimą yra neefektyvi. Tarkime, kad duomenų bazėje saugome 1 000 000 pranešimų, tačiau per pastarąsias kelias dienas 95% visų peržiūrų sudaro tik 100 pranešimų. Tačiau kiekvieną kartą turime pereiti į didžiulį duomenų bazės failą ir ieškoti joje kelių dažnai prašomų įrašų – tai padidina serverio apkrovą ir laiką, reikalingą svetainei atidaryti. Jei šiuos įrašus įdėsime į talpyklą, tai paspartinsime svetainę ir nereikės pirkti galingų serverių. Žodyje, pinigai yra pelnas!

Talpykla yra įvairių formų. Paprasčiausias dalykas yra kaupimas talpykloje. Neigiama yra tai, kad duomenys vis tiek saugomi diske, o tai gali sukelti skaudžių pasekmių. Tarpinius rezultatus galite išsaugoti duomenų bazėje (pavyzdžiui, kai kurių forumo variklių paieškos rezultatai yra saugomi duomenų bazėje). Na, o efektyviausias dalykas, žinoma, yra saugojimas RAM. Tam yra daugybė trečiųjų šalių programų: „Memcached“, „eAccelerator“, APC, „XCache“. Beje, MySQL taip pat gali saugoti duomenis savo talpykloje (kalbame ne apie indeksus atmintyje).

Apskritai jie rašo, kad „eAccelerator“ ir „XCache“ yra efektyvesni nei „Memcached“, jei naudojate vieną serverį, nes „Memcached“ atveju turite atidaryti TCP ryšį. Tačiau „Memcached“ turi pagrindinį pranašumą – galimybę paskirstyti duomenis keliuose serveriuose. Pavyzdžiui, LiveJournal talpykla netilps net į galingiausio serverio atmintį. Tiesą sakant, „Memcached“ buvo išrastas „LiveJournal“, kad duomenis būtų galima saugoti keliuose serveriuose. Tačiau mums, pradedantiesiems, dar per anksti apie tai galvoti.

„Memcached“ savybės

  • Paprasta duomenų saugojimo struktūra (rakto vertė).
  • Maksimalus talpyklos veikimo laikas yra 30 dienų.
  • Didžiausias vieno elemento tūris yra 1 Mb
  • Galite saugoti objektus ir masyvus tokius, kokie yra. Kai kaupiate talpyklą failuose arba duomenų bazėje, tokius dalykus prieš išsaugant reikia įdėti į eilutę naudojant serializavimą.
  • Nėra autorizacijos (slaptažodis-prisijungimas). Tie. jei serveris turi „Memcached“, bet kuris to paties serverio vartotojas gali jį pasiekti.
  • Duomenų prieigos greitis nepriklauso nuo elementų skaičiaus talpykloje. Taip Taip tiksliai.

Montavimas

Tinkle yra daug diegimo instrukcijų, nesvarbu, ar tai yra „Unix“, ar „Windows“. Be pačios „Memcached“, taip pat reikia įdiegti lib, kad galėtumėte pasiekti „Memcached“ per PHP (pagal analogiją su MySQL duomenų baze - be pačios duomenų bazės, dar reikia įdiegti mysql arba mysqli plėtinį).

Tačiau lengviausias būdas yra parašyti šeimininkui. „Fastvps“ užsakant serverį „Memcached“ yra įdiegtas pagal numatytuosius nustatymus. Svarbiausia yra nurodyti, kiek atminties reikia skirti talpyklai. Pagal numatytuosius nustatymus jis yra 67 Mb. Turiu 4 Gb RAM, tad galiu drąsiai skirti 1 Gb. Apskritai, lengviausias būdas įvertinti, kiek atminties reikia talpyklai, yra padauginti duomenų bazės dydį iš 2. Pavyzdžiui, visų mūsų svetainių duomenų bazės sveria 300 MB, tada talpyklai skiriame 600 MB arba geriau paimti 1 GB su marža.

„Memcached“ galima pamatyti phpinfo

Apžiūra

Paprastai „Memcached“ veikia „localhost“ ir yra pasiekiamas per prievadą 11211
Pažiūrėkime į statistiką

connect("localhost",11211); print_r($memcache->getStats()); ?>

Rezultatas:
Masyvas
=> 5915
=> 583
=> 1309538445
=> 1.2.2
=> 64
=> 0.000000
=> 0.004000
=> 0
=> 0
=> 0
=> 1
=> 2
=> 2
=> 0
=> 0
=> 0
=> 0
=> 0
=> 7
=> 0
=> 1073741824
=> 1
)

Po kurio laiko statistika atrodys maždaug taip

Masyvas
=> 5915
=> 6202245
=> 1315740107
=> 1.2.2
=> 64
=> 3.464216
=> 10.868679
=> 298
=> 17728
=> 120366
=> 1
=> 28654
=> 4
=> 133296
=> 17728
=> 124758
=> 8538
=> 0
=> 11125692
=> 103815319
=> 1073741824
=> 1
)

Pagrindiniai parametrai:
=> 298 - kiek dabartinių elementų yra talpykloje.
=> 17728 – kiek iš viso elementų buvo talpykloje (įskaitant ištrintus)
=> 120366 – kiek baitų šiuo metu yra talpykloje
=>1073741824 – kiek baitų paprastai galima talpykloje (čia 1 Gb)
=> 124758 – kiek kartų paėmėme duomenis iš talpyklos
=> 8538 – kiek kartų bandėme paimti duomenis iš talpyklos, bet jų nebuvo arba talpyklos galiojimo laikas baigėsi.

Santykis get_miss/get_hits parodo talpyklos naudojimo efektyvumą. Kuo jis mažesnis, tuo efektyviau naudojama talpykla. Tokiu atveju gauname, kad 93% duomenų paimami iš talpyklos. Jei get_misses/get_hits=1, vadinasi, darote kažką ne taip (greičiausiai nustatote per trumpą talpyklos veikimo laiką).

vizualinė statistika
Aukščiau pateiktas kodas rodo statistiką sausa forma, pvz., print_r ()
Yra graži statistikos išvestis - phpMemcachedAdmin

Tai įprastas PHP scenarijus. Atidarote jį savo svetainėje ir gaunate gražų dizainą.
Nereikia nieko konfigūruoti. Pagal numatytuosius nustatymus jis jungiasi prie localhost:11211
Jį galite atsisiųsti oficialiame puslapyje.

„Memcache“ naudojimo pavyzdžiai

Tarkime, kad turime eilutę „test111“, norime ją laikyti talpykloje 1 dieną. Sugalvokime tam kokį nors raktą „key1“.

connect("localhost",11211); $memcache->set("key1", "test111", false, 86400); // talpyklos 1 dienai. $get_result = $memcache->get("key1"); // gauti duomenis print_r($get_result); ?>

Šiek tiek komplikuosime dalykus

get($key)) ( $get_result = $memcache->get($key); print_r($get_result); ) else ( $result = "test222"; // $result yra kai kurių skaičiavimų rezultatas arba pavyzdys iš duomenų bazė $memcache->set($key, $result, false, 86400); echo "talpykla buvo įrašyta 1 dieną"; ) ?>

Tik nuo antrojo šio scenarijaus paleidimo pamatysime savo duomenis.

Taip pat pamiršau pridėti apie talpyklos veikimo laiką. „Memcached“ galioja iki 1 mėnesio. Taigi, jei nustatysite 365 dienas, „Memcached“ tiesiog jų neišsaugos ir neduos jokios klaidos. Todėl, jei jūsų duomenys nesikeičia ilgą laiką ir norite nustatyti maksimalų tarnavimo laiką, nurodykite false
$memcache->set($raktas, $rezultas, false, false);

Raktų įvardijimo ypatumai. Kaip raktą geriau naudoti md5(key), nes maksimalus rakto ilgis yra 250 simbolių ir tarpų naudoti negalima. Kai talpinate SQL užklausas su sąlyga, raktas bus toks: $key = "blog_id_1 WHERE activity=1 AND ... AND ... LIMIT 10"

Be to, prie rakto taip pat reikia pridėti tam tikrą konstantą, kuri nustato, kuriai svetainei priklauso talpykla.
$raktas = md5(PROJEKTAS."key2"); // kur konstanta yra PROJECT="site.com"

Jei tai nebus padaryta, antroji svetainė tame pačiame serveryje gali perrašyti pirmosios svetainės duomenis tuo pačiu raktu. Faktas yra tas, kad „Memcached“ neturi prieigos, pavyzdžiui, duomenų bazės, todėl turite apriboti prieigą tokiu būdu. Trumpai tariant, „Memcached“ yra toks didelis raktų ir verčių porų sąvartynas. Todėl visos svetainės talpyklą saugo viename „Memcached“. Tuo pačiu metu, pavyzdžiui, negalime paimti paskutinių 10 įrašytų elementų (pvz., LIMIT 10 duomenų bazėje). „Memcached“ struktūra yra labai paprasta, tačiau dėl to gauname didelį našumą.

Žymėjimas

Kadangi „Memcached“ yra itin paprastas (duomenys niekaip nesusiję – yra tik rakto ir reikšmės ryšys), praktikoje iškyla tam tikrų sunkumų. Tarkime, kad turime tokius tinklaraščius kaip Habré. Parašėme įrašą ir išsaugojome talpykloje. Sukūrėme keletą raktų-reikšmių porų: talpyklą pačiam įrašui, talpyklą tinklaraščiui, kuriame rodomas šis įrašas, talpyklą tiesioginei transliacijai, talpyklą, skirtą vartotojo įrašams rodyti vartotojo profilyje ir kt.

$memcache->set("post_id_2211", "data");
$memcache->set("post_blog_id_11", "data");
$memcache->set("live_posts", "data");
$memcache->set("post_user_id_331", "data");

Bet staiga moderatorius įrašą ištrynė. Turime išvalyti visas talpyklas, susijusias su šiuo įrašu.

$memcache->delete("post_id_2211");
$memcache->delete("post_blog_id_11");
$memcache->delete("live_posts");
$memcache->delete("post_user_id_331");

Trumpai tariant, dėl „Memcached“ paprastumo turime rankiniu būdu sukurti papildomą kodą. Be to, turime nuolat prisiminti, kurios talpyklos yra susietos su kitomis talpyklomis. Problemos sprendimas labai paprastas. Prie kiekvieno talpyklos elemento pridedame žymą arba kelias žymas.
Galite paskaityti daugiau.

Praktika

Praktiškai niekas nenaudoja gryno „Memcached“. Paprastai jie naudoja tam tikrą įvyniojimo klasę, kuri palaiko žymėjimą. Dažniausias sprendimas yra „ZendCache“.

Atsisiųsti į vieną archyvą su visais pavyzdžiais
Įdėkime ZendCache klasę į lib aplanką

Struktūra turėtų būti tokia, žiūrint iš šaknies
/lib/DklabCache/...
/class/Cache.class.php
/stat.php
/get_post.php
/update_post.php

Wrapper klasė (arba kaip ji dar vadinama - wrapper) naudojant ZendCache

array(masyvas("host" => MEMCACHED_HOST, "port" => MEMCACHED_PORT, "persistent" => false),), "compression" => false,); self::$instance = nauja talpykla; self::$instance->memcache = new Dklab_Cache_Backend_TagEmuWrapper(new Zend_Cache_Backend_Memcached($aConfigMem)); ) else ( return NULL; ) ) return self::$instance; ) viešoji funkcija get($key) ( return $this->memcache->load($key); ) viešųjų funkcijų rinkinys($key, $value, $tags=array(), $timeLife=false) ( return $this ->memcache->save($value, $key, $tags, $timeLife); ) viešoji funkcija delete($key) ( $this->memcache->remove($key); ) viešoji funkcija švari($cMode = Zend_Cache::CLEANING_MODE_ALL, $tags = array()) ( return $this->memcache->clean($cMode,$tags); ) viešoji funkcija __construct() ( ) viešoji funkcija __clone() ( ) ) ?>

Tai yra mūsų vienkartinė klasė, paprastais žodžiais tariant, pirmo skambučio metu sukuriamas klasės egzempliorius (skaitymas, prisijungimas prie „Memcached“) ir naudojamas kitam skambučiui. Taigi per vieną scenarijų nesukuriame nereikalingų ryšių ir taupome resursus.

CACHE_USE konstanta nurodyta atskirai konfigūracijose. Naudodami jį galite įjungti / išjungti talpyklą.

Parametras "compression" => false reiškia, kad duomenų talpykloje neglaudiname. Suspaudimas yra būtinas norint sutaupyti vietos atmintyje, tačiau suspaudimas užtrunka šiek tiek laiko. Todėl, jei atminties kiekis jums nėra labai svarbus, mes jį išjungiame glausčiau.

Parametras "persistent" => false reiškia nuolatinio ryšio išjungimą (panašiai kaip mysql_pconnect())

Beje, čia galite pamatyti, kaip naudotis keliais serveriais. Jei turime 1 serverį

"serveriai" => array(masyvas("host" => "localhost", "port" => 11211, "persistent" => false))

Pavyzdžiui, mes turime 3 „Memcached“ serverius

"serveriai" => array(masyvas("host" => "11.33.45.11", "port" => 11211, "persistent" => false), array("host" => "11.33.45.12", "prievadas" " => 11211, "persistent" => false), array("host" => "11.33.45.13", "port" => 11211, "persistent" => false))

Gerąja prasme tokius dalykus reikia perkelti iš klasės į konfigūraciją.

Dabar šią klasę prijungiame prie scenarijaus, kuriame norime ką nors išsaugoti talpykloje
Tarkime, paskelbimo išvesties scenarijus (archyve tai yra get_post.php)
Pavyzdžiai tikrai nėra patys geriausi, bet geriau nei nieko.
Aš specialiai išjungiau darbą su duomenų baze, kad turėtumėte mažiau problemų.

get($key_cache)))( echo "duomenys paimti iš talpyklos"; return $data; ) else ( // rasti įrašą duomenų bazėje (vykdyti select) //$data = $DB->selectRow("SELECT * FROM post WHERE id=?d", $postID); // norėdami supaprastinti pavyzdį, paimame paruoštą masyvą (įrašas susietas su dienoraščiu, kurio ID=3) $data = array("id"=>$ postID, "blog_id"=>3, "title "=>"Naujienos 111", "tekstas"=>"tam tikras tekstas"); if (!empty($data)) (if (isset($Cache)) ( $ Cache->set($key_cache, $ data, array("post_update", "post_update_".$postID, "post_blog_".$data["blog_id"]), 3600*24*10); echo "išsaugotus duomenis talpykloje "; ) return $data; ) else return null; ) ) $postID = 25; $post = get_post($postID); print_r($post); ?> Norime įrašyti įrašą su id=25. Kai skambinate pirmą kartą, turėtumėte pamatyti pranešimą „išsaugoti duomenys talpykloje“. Kai skambinsite dar kartą, pamatysite pranešimą „duomenys paimti iš talpyklos“. Dabar pabandykime atnaujinti įrašą (paleiskite scenarijų update_post.php)query("ATNAUJINTI įrašo SET blog_id =?d, title=?, text=? WHERE id=?d", $blogID, $title, $tekstas, $postID); // išvalyti žymes, susijusias su šiuo įrašu $Cache = Cache::getInstance(); if (isset($Cache)) ( $Cache->clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG, array("post_update", "post_update_".$postID, "post_blog_".$blogID)); ) return true; ) $postID = 25; update_post($postID, 3, "testas", "bandymo testas"); ?>

Tada paleidžiame get_post.php scenarijų ir matome, kad talpykloje nėra duomenų ir vėl įrašėme: „išsaugoti duomenys talpykloje“.

Tiesą sakant, sunkiausia talpykloje yra įdėdami tinkamas etiketes. Kad atnaujinus įrašą būtų atnaujinti duomenys, kuriuose yra šis įrašas.

Aukščiau pateiktame pavyzdyje tai buvo žymos

  • "post_update_".$postID – pats įrašas (dažniausiai įrašo išvesties puslapis)
  • "post_blog_".$blogID – tinklaraščio puslapis, kuriame rodomas šio tinklaraščio įrašų sąrašas
  • „post_update“ – žyma, susieta su pagrindiniu puslapiu arba geriausių įrašų sąrašu

Šunų krūvos efektas

Išversta kaip „šunų gauja“. Tarkime, kad turite sudėtingą duomenų bazės pavyzdį 2 sekundėms. Jo dar nėra talpykloje (arba mes iš naujo nustatome talpyklą). Atvyksta pirmasis vartotojas, siunčiama užklausa į duomenų bazę ir tik po 2 sekundžių šie duomenys pasirodys talpykloje. Taigi per šias 2 sekundes svetainėje gali apsilankyti dar 10 žmonių, kurie inicijuoja dar 10 tokių pat sudėtingų užklausų į duomenų bazę (nes duomenų talpykloje dar nėra, o pirmoji užklausa vis dar vykdoma). Dėl to susidaro šunų gauja, kuri įkelia serverį.

atrodo kazkaip taip :)

Aprašytas problemos sprendimas.
Aukščiau pateiktas kodas neapsaugo nuo šunų krūvos efekto. Mano atveju tokio didelio srauto ir ilgų užklausų nėra.

Taikydami šiame straipsnyje pateiktą informaciją galėsite įdiegti ir sukonfigūruoti „Memcached“ serverį ir būtiną php plėtinį, kad galėtumėte su juo sąveikauti, taip pat analizės ir statistikos paslaugą „phpMemcachedAdmin“.

Diegimas vyks naudojant „Debian“ su vidiniu serveriu. Jei turite veikiantį paketą + php5-fpm, tiesiog komandose pakeiskite apache2 į php5-fpm
Darbo įrankiai: failų tvarkyklė programinei įrangai sujungti su įmontuotu redaktoriumi ar glaistu.

Tarkime, kad šioje priegloboje jau turime svetainę http://example.com

Pirmiausia turite nustatyti, kaip sukonfigūruotas PHP (kas, jei „Memcached“ jau įdiegta?)). Norėdami tai padaryti, svetainės šaknyje laikinai sukursime failą info.php su kodu

Dabar pažvelkime į tai http://example.com/info.php

Jeigu matome, kad yra panašus įrašas, vadinasi, viskas tvarkoje, įdiegtas reikalingas php plėtinys.
Jei ne, tada jūs turite dirbti.

Kaip įdiegti „Memcached“ serverį

Prieš diegdami turite atnaujinti saugyklą

Apt-get update && apt-get upgrade

Dabar įdiegkime „memcached“ ir jam skirtą php modulį

Apt-get install memcached php5-memcache

Diegimas vyksta. Kai jis bus baigtas, mes patikriname, kas atsitiko

Dėl to pamatysime kažką panašaus

Tcp 0 0 *:11211 *:* KLAUSYTI 13053/atmintinė

Dabar reikia iš naujo paleisti Apache arba php-fpm

Apache2 paslaugos paleidimas iš naujo

„Memcached“ nustatymas

Dabar, kai serveris įdiegtas, jį reikia sukonfigūruoti. Tai nėra sunku ir neužims daug laiko

„Memcached“ uždarymas iš išorės

Kaip matote, „memcached“ pagal numatytuosius nustatymus kabo prie 11211 prievado. Kadangi „memcached“ neturi įmontuotų autentifikavimo mechanizmų, pasirodo, kad kiekvienas gali prisijungti iš išorės ir naudoti jį savo tikslams. Norėdami to išvengti, galite uždaryti prievadą 11211 naudodami ugniasienę arba sukonfigūruoti atmintyje išsaugotą serverį, kad jį būtų galima naudoti tik iš „localhost“. Paskutinis metodas aprašytas žemiau.

  1. Pridėkite eilutę -l 127.0.0.1
  2. Iš naujo paleiskite atmintinę

    Paslaugos atmintyje iš naujo paleisti

    /etc/init.d/memcached paleisti iš naujo

Ir vėl patikriname

Netstat -tap | grep atmintyje

Galų gale turėtume pamatyti kažką panašaus

Tcp 0 0 localhost.localdo:11211 *:* KLAUSYTI 13092/memcached

Taip pat po visų pakeitimų nepamirškite iš naujo paleisti „Apache“.

Apache2 paslaugos paleidimas iš naujo

Padidinkite darbinės atminties „Memcached“ kiekį

Pagal numatytuosius nustatymus „Memcached“ yra skirta naudoti 64 megabaitus RAM. Padidinsiu iki 1024, jūs tęsite savo serverio parametrus

  1. Atidarykite vi konfigūracijos failą /etc/memcached.conf
  2. Raskite reikšmę -m 64
  3. Pakeiskite jį į -m 1024
  4. Iš naujo paleiskite „memcached“ paslaugą „memcached“ paleisti iš naujo

PHP seansų saugojimas „Memcached“.

Jei kelios skirtingos svetainės naudoja tą patį „Memcached“ serverį arba klasterį, jos gali perimti viena kitos seansus ir gauti prieigą prie savo vartotojų paskyrų, o tai kelia potencialų pavojų.

Galite pagreitinti PHP perkeldami seanso saugyklą iš HDD į RAM naudodami atmintinę

Turėtumėte žinoti, kurį php plėtinį naudojate, „memcache“ ar „memcached“. , o ką turite, galite sužinoti naudodami phpinfo(), nustatymuose yra subtilumų, būkite atsargūs

Memcache išplėtimo būdas

  1. Atidarykite /etc/php5/mods-available/memcache.ini
  2. Pridėti session.save_handler = atminties talpyklos session.save_path = "tcp://127.0.0.1:11211"

MemcacheD išplėtimo metodas

  1. Atidarykite /etc/php5/mods-available/memcached.ini
  2. Pridėti session.save_handler = atmintyje išsaugota session.save_path = "127.0.0.1:11211"
  3. Iš naujo paleiskite apache paslaugą apache2 restart

Tikrinama phpinfo

Dabar turime patikrinti, ką turime išėjime. Norėdami tai padaryti, atidarykite puslapį naudodami phpinfo() ir ieškokite session.save_path kode stulpelyje su vietinėmis reikšmėmis. Reikšmė turėtų būti tcp://127.0.0.1:11211 arba 127.0.0.1:11211 ..conf), ir mes ieškome
php_admin_value session.save_path

Beje, php_value direktyva taip pat galite konfigūruoti ne visą serverį globaliai, o tik konkrečias svetaines. Norėdami tai padaryti, galite redaguoti .htaccess savo svetainės šaknyje

Php_value session.save_handler "memcache" php_value session.save_path "tcp://127.0.0.1:11211"

Paruoštas veikiantis atminties talpyklos konfigūracijos failas

Taip pat galite pritaikyti viską pagal savo poreikius, konfigūracijos faile yra išsamūs komentarai:

# atmintyje išsaugotas numatytasis konfigūracijos failas # 2003 – Jay Bonci< ># Šį konfigūracijos failą nuskaito paleisties atmintyje įrašytas scenarijus, pateiktas kaip # Debian GNU/Linux platinimo dalis. # Vykdykite atminties talpyklą kaip demoną. Ši komanda yra numanoma ir jos nereikia, kad # demonas veiktų. Norėdami gauti daugiau # informacijos, žr. su šiuo paketu pateiktą README.Debian. -d # Užregistruokite memcached" išvestį į /var/log/memcached žurnalo failą /var/log/memcached.log # Būkite išsamūs # -v # Būkite dar išsamesni (taip pat spausdinkite kliento komandas) # -vv # Pradėkite nuo didžiosios raidės 64 megabaitais atminties. Tai pagrįsta, o demonas numatytasis # Atkreipkite dėmesį, kad demonas išaugs iki tokio dydžio, bet nepradės turėti tiek daug atminties # Atminties kiekis megabaitais, skirtas talpyklai saugoti. Pagal numatytuosius nustatymus 64 megabaitai. #-m 64 -m 1024 # Prievadas, kuriame bus „Memcached“, pagal numatytuosius nustatymus 11211 -p 11211 # Paleiskite demoną kaip root. Jei šiame konfigūracijos faile nėra komandos # -u. -u memcache # Nurodykite, kurio IP adreso klausytis. Numatytasis nustatymas yra klausytis visų IP adresų # Šis parametras yra viena iš vienintelių saugos priemonių, kurias turi atmintinė, todėl įsitikinkite, kad # ji klausosi ugniasienės sąsajoje. -l 127.0.0.1 # Apribokite vienu metu gaunamų jungčių skaičių. Numatytasis demono nustatymas yra 1024 # # -c 1024 # Užrakinti visą puslapių atmintį. Prieš tai darydami pasitarkite su README ir pagrindiniu puslapiu # -k # Grąžinimo klaida, kai išsenka atmintis (o ne pašalinus elementus) # -M # Maksimaliai padidinkite pagrindinį failą riba # -r

Memcache plėtinio įdiegimas

Žemiau yra nuoseklios komandos, su kuriomis galite rankiniu būdu įdiegti „memcache PHP“ plėtinį iš konsolės

Apt-get install php5-dev libmemcache-dev pecl atsisiųsti memcache tar xzvf memcache-2.2.6.tgz cd memcache-2.2.6/ phpize && ./configure --enable-memcache && make cp modules/memcache.so /usr/ lib/php5/20060613/ echo "extension=memcache.so" >> /etc/php5/apache2/php.ini

Iš naujo paleiskite „Apache“, kad pakeitimai įsigaliotų.

Apache2 paslaugos paleidimas iš naujo

Kaip patikrinti, ar „Memcached“ veikia

Svetainės šaknyje sukurkime failą memcachetest.php ir įrašykite ten tokį kodą

connect("localhost", 11211) arba exit("Nepavyko prisijungti prie atmintinės talpyklos serverio"); $versija = $memcache->getVersion(); echo "Serverio versija: ".$version."
\n"; $tmp_object = new stdClass; $tmp_object->str_attr = "testas"; $tmp_object->int_attr = 123; $memcache->set("raktas", $tmp_object, false, 10) arba miršta ("Ne" Man pavyko palikti įrašą „Memcached“); aidas „Rašome duomenis į „Memcached“ talpyklą (duomenys bus saugomi 10 sekundžių)
\n"; $get_result = $memcache->get("key"); echo "Duomenys įrašyti į atminties talpyklą:
\n"; var_dump($gauti_rezultatą); ?>

Dabar belieka patikrinti rezultatus: http://example.com/memcachetest.php
Jei viską padarėte teisingai, pamatysite kažką panašaus

phpMemcachedAdmin – „Memcached“ stebėjimas, statistika ir valdymas

„phpMemcachedAdmin“ yra programinė įranga, teikianti žiniatinklio sąsają „Memcached“ paslaugai „Linux“ stebėti ir valdyti. Leidžia matyti visų serverio palaikomų operacijų statistiką realiuoju laiku: gauti, nustatyti, ištrinti, didinti, mažinti, susigrąžinti, iškeldinti, CAS, taip pat serverio statistiką: tinklą, pozicijas, darbo versiją, kartu su diagramomis ir vidinėmis serverio konfigūracija.

„phpMemcachedAdmin“ diegimas ir konfigūravimas

Čia galite eiti keliais būdais: paskirkite atskirą domeną arba subdomeną šios paslaugos veikimui. Arba galite sukurti pakatalogį savo darbo svetainėje ir įdėti slaptažodį arba . Paskutinį slaptažodžio nustatymo aplanke būdą aprašysiu kaip paprastesnį.

Taigi, tarkime, kad turime svetainę https://site

CD /var/www/site

Sukurkite katalogą ir eikite į jį

Mkdir phpMemcachedAdmin && cd phpMemcachedAdmin

Atsisiųskite naujausią platinimo versiją

Wget http://phpmemcacheadmin.googlecode.com/files/phpMemcachedAdmin-1.2.2-r262.tar.gz

Išpakuokite ir ištrinkite platinimo archyvą

Tar -xvzf phpMemcachedAdmin-1.2.2-r262.tar.gz && rm -rf phpMemcachedAdmin-1.2.2-r262.tar.gz

Rekursyviai nustatykite reikiamas prieigos teises dabartiniame kataloge

Rasti ./ -type f -exec chmod 0644 () \; rasti ./ -type d -exec chmod 0755 () \;

AuthType Basic AuthName "Privati ​​sritis" AuthUserFile .htpasswd Reikalauti vartotojo memcachedmanager

Create.htpasswd

Htpasswd -c .htpasswd atminties talpyklos valdytojas

Įveskite savo slaptažodį.

Tai viskas. Prisijunkite prie memcachedmanager katalogo, jei jo nepakeitėte. Atidarykite https://site/phpMemcachedAdmin (pakeiskite domeną į savo), įveskite savo prisijungimo vardą / slaptažodį ir naudokite

Pagaliau

Rekomenduoju perskaityti straipsnį apie „memcached“. Jame atskleidžiama bendra informacija apie jį ir kai kurios jo darbo subtilybės.
Tai viskas. Jei kas nors neaišku, užduokite klausimus komentaruose.

Šiuo įrašu noriu atidaryti nedidelę pranešimų seriją, pagrįstą HighLoad++-2008 ataskaitos medžiaga. Vėliau visas tekstas bus paskelbtas kaip vienas didelis PDF.

Įvadas

Pirma, apie įrašų serijos pavadinimą: įrašai bus apie talpyklą žiniatinklyje (didelės apkrovos žiniatinklio projektuose), ir apie atmintinės talpyklos naudojimą talpykloje bei apie kitus atmintinės naudojimo būdus žiniatinklio projektuose. Tai yra, visi trys vardo komponentai įvairiais deriniais bus aprašyti šioje įrašų serijoje.

Šiandien talpyklos kaupimas yra neatsiejama bet kurio žiniatinklio projekto dalis, nebūtinai didelio apkrova. Kiekvienam ištekliui svarbi vartotojo charakteristika yra serverio atsako laikas. Padidėjęs serverio atsako laikas lemia lankytojų nutekėjimą. Todėl būtina kuo labiau sumažinti atsako laiką: tam reikia sutrumpinti laiką, reikalingą atsakymui vartotojui sugeneruoti, o atsakymui vartotojui reikia gauti duomenis iš kai kurių išorinių išteklių (backend). Šie ištekliai gali būti duomenų bazės arba bet kurie kiti santykinai lėti duomenų šaltiniai (pavyzdžiui, nuotolinis failų serveris, kuriame tikriname laisvos vietos kiekį). Norint sukurti vieną gana sudėtingo šaltinio puslapį, mums gali tekti atlikti daugybę panašių skambučių. Daugelis jų bus greiti: 20 ms ar mažiau, tačiau visada yra nedidelis skaičius užklausų, kurių skaičiavimo laikas gali būti skaičiuojamas sekundėmis ar minutėmis (net ir labiausiai optimizuotoje sistemoje gali būti viena, nors jų skaičius turėtų būti minimalus) . Jei susumuojame visą laiką, kurį praleidžiame laukdami užklausos rezultatų (jei užklausas vykdysime lygiagrečiai, imsime ilgiausios užklausos skaičiavimo laiką), gausime nepatenkinamą atsakymo laiką.

Šios problemos sprendimas yra talpyklos kaupimas: skaičiavimų rezultatą talpiname į kokią nors saugyklą (pavyzdžiui, atmintinėje), kuri pasižymi puikiomis prieigos prie informacijos savybėmis. Dabar, užuot skambinę lėtoms, sudėtingoms ir sunkioms sistemoms, tereikia pateikti užklausą į sparčiąją talpyklą.

Išsaugota atmintyje ir talpykloje

Vietos principas

Visur matome talpyklą arba talpyklos metodą elektroniniuose įrenginiuose ir programinės įrangos architektūroje: CPU talpykloje (pirmasis ir antrasis lygis), standžiojo disko buferiai, operacinės sistemos talpykla, buferis automobilio radijuje. Kas lemia tokią talpyklos sėkmę? Atsakymas slypi lokalumo principe: programa ar įrenginys yra linkę dirbti su tam tikru duomenų poaibiu iš bendrojo rinkinio per tam tikrą laikotarpį. RAM atveju tai reiškia, kad jei programa dirba su duomenimis, esančiais adresu 100, tada su didesne tikimybe kita prieiga bus adresu 101, 102 ir tt, o ne, pavyzdžiui, adresu 10000. Lygiai taip pat ir su kietuoju disku: jo buferis užpildytas duomenimis iš sričių, esančių šalia paskutinių skaitytų sektorių.Jei mūsų programos vienu metu dirbtų ne su kokiu nors palyginti nedideliu failų rinkiniu, o su visu kietojo disko turiniu. , buferiai būtų beprasmiai. Automobilio stereofoninis buferis nuskaito prieš kitas minutes muzikos iš disko, nes labiau tikėtina, kad muzikos failą klausysime paeiliui, nei peršoksime muzikos rinkinį ir pan.

Interneto projektų atveju talpyklos sėkmę lemia tai, kad svetainėje visada yra populiariausi puslapiai, kai kurie duomenys naudojami visuose arba beveik visuose puslapiuose, tai yra, yra keletas pasirinkimų, kurių prašoma daug dažniau. nei kiti. Mes pakeičiame kelis skambučius į backend vienu skambučiu, kad sukurtume talpyklą, o tada visi tolesni skambučiai bus atliekami per greitai veikiančią talpyklą.

Talpykla visada yra geresnė už pradinį duomenų šaltinį: procesoriaus talpykla yra daug greičiau nei RAM, bet negalime padaryti RAM tokios greitos kaip talpyklos – tai neefektyvu ir techniškai sudėtinga. Kietojo disko buferis duomenų užklausas patenkina dydžiu greičiau nei pats kietasis diskas, tačiau buferis neturi galimybės atsiminti duomenų, kai išjungiamas maitinimas – šia prasme jis yra blogesnis nei pats įrenginys. Panaši situacija yra su talpyklomis internete: talpykla yra greitesnė ir efektyvesnė nei užpakalinė programa, tačiau dažniausiai serverio paleidimo iš naujo ar gedimo atveju ji negali išsaugoti duomenų, taip pat neturi logikos skaičiuoti rezultatus: jis gali grąžinti tik tai, ką anksčiau įdėjome.

Atmintinė

„Memcached“ yra didžiulė atmintyje esanti maišos lentelė, pasiekiama per tinklo protokolą. Tai teikia su raktais susietų verčių saugojimo paslaugą. Maišą pasiekiame per paprastą tinklo protokolą, klientas gali būti savavališka programavimo kalba parašyta programa (yra C/C++, PHP, Perl, Java ir kt. klientai).

Paprasčiausios operacijos yra gauti nurodyto rakto reikšmę (get), nustatyti rakto reikšmę (set) ir ištrinti raktą (del). Norint įgyvendinti atominių operacijų grandinę (atsižvelgiant į lygiagrečių procesų priėjimą prie atmintyje saugomų duomenų), naudojamos papildomos operacijos: rakto reikšmės padidinimas/mažinimas (incr/decr), duomenų pridėjimas prie rakto reikšmės pradžios arba pabaigos (pridėti). /prepend), atominio susiejimo gavimo / nustatymo vertes (gets/cas) ir kt.

„Memcached“ įgyvendino Bradas Fitzpatrickas, vykdydamas „LiveJournal“ projektą. Jis buvo naudojamas siekiant apsaugoti duomenų bazę nuo užklausų teikiant puslapio turinį. Šiandien „memcached“ buvo naudojamas daugelyje didelių projektų, pavyzdžiui, „Wikipedia“, „YouTube“, „Facebook“ ir kt.

Apskritai talpyklos schema atrodo taip: frontend (projekto dalis, kuri generuoja atsakymą vartotojui) turi gauti duomenis iš tam tikro pavyzdžio. Frontend susisiekia su gepardo greitu atmintinėje išsaugotu serveriu, kad gautų talpyklą (gauti užklausą). Jei randamas atitinkamas raktas, darbas tuo ir baigiasi. Kitu atveju turėtumėte kreiptis į sunkų, gremėzdišką, bet galingą (kaip dramblys) backend, kuris dažniausiai yra duomenų bazė. Gautas rezultatas nedelsiant įrašomas į atmintinę kaip talpyklą (nustatyti užklausą). Šiuo atveju raktui paprastai suteikiamas maksimalus tarnavimo laikas (galiojimo laikas), kuris atitinka talpyklos atstatymo momentą.

Ši standartinė talpyklos schema visada įgyvendinama. Vietoj atmintinės, kai kuriuose projektuose gali būti naudojami vietiniai failai arba kiti saugojimo metodai (kita duomenų bazė, PHP greitintuvo talpykla ir kt.). Tačiau, kaip bus parodyta toliau, didelės apkrovos projekte ši schema gali neveikti pačiu efektyviausiu būdu. . Nepaisant to, tolimesnėje istorijoje mes remsimės šia schema.

atmintinė architektūra

Kaip veikia memcached? Kaip ji sugeba veikti taip greitai, kad net dešimtys užklausų į atmintinę, reikalingos vienam svetainės puslapiui apdoroti, nesukeltų didelio vėlavimo. Tuo pačiu metu „memcached“ yra labai nereiklus skaičiavimo resursų: įkeltoje instaliacijoje jo naudojamas procesoriaus laikas retai viršija 10%.

Pirma, memcached sukurtas taip, kad visos jo operacijos turėtų algoritminį sudėtingumą O(1), t.y. bet kokios operacijos vykdymo laikas nepriklauso nuo atmintinėje išsaugotų raktų skaičiaus. Tai reiškia, kad kai kurių operacijų (arba galimybių) trūks, jei jų įgyvendinimui reikės tik tiesinio (O(n)) laiko. Taigi „memcached“ neturi galimybės sujungti raktų „į aplankus“, t.y. bet koks raktų grupavimas, o grupinių operacijų su raktais ar jų reikšmėmis nerasime.

Pagrindinės optimizuotos operacijos yra atminties blokų, skirtų raktams saugoti, paskirstymas / atlaisvinimas, mažiausiai naudojamų raktų (LRU) politikos nustatymas, kad būtų išvalyta talpykla, kai nepakanka atminties. Raktų paieška vyksta naudojant maišą, todėl jos sudėtingumas yra O(1).

Naudoja asinchroninį I/O ir nenaudoja gijų, o tai suteikia papildomo našumo padidėjimo ir mažesnių išteklių poreikių. Tiesą sakant, „memcached“ gali naudoti gijas, tačiau tai būtina tik norint išnaudoti visus serverio esančius branduolius ar procesorius, esant per daug apkrovos – jokiu būdu kiekvienam ryšiui gija nesukuriama.

Tiesą sakant, galime teigti, kad atmintyje išsaugoto serverio atsako laikas yra nulemtas tik tinklo sąnaudų ir yra beveik lygus laikui, per kurį paketas perduodamas iš priekinės dalies į atmintinėje saugomą serverį (RTT). Tokios charakteristikos leidžia naudoti atminties talpyklą labai apkrautuose žiniatinklio projektuose, siekiant išspręsti įvairias problemas, įskaitant duomenų kaupimą talpykloje.

Pamesti raktai

„Memcached“ nėra patikima saugykla; gali būti, kad raktas bus pašalintas iš talpyklos nepasibaigus jo galiojimo laikui. Projekto architektūra turi būti pasirengusi tokiai situacijai ir turi lanksčiai reaguoti į raktų praradimą. Yra trys pagrindinės raktų praradimo priežastys:
  1. Raktas buvo ištrintas nepasibaigus jo galiojimo laikui, nes neužteko atminties saugoti kitų raktų reikšmes. „Memcached“ naudoja LRU politiką, todėl šis praradimas reiškia, kad raktas buvo naudojamas retai, o talpyklos atmintis yra atlaisvinama populiariems raktams saugoti.
  2. Raktas buvo ištrintas, nes baigėsi jo galiojimo laikas. Ši situacija, griežtai tariant, nėra nuostolis, nes mes patys apribojome rakto tarnavimo laiką, tačiau kliento kodui, susijusiam su „memcached“, toks praradimas nesiskiria nuo kitų atvejų - prisijungę prie „memcached“ gauname atsakymą „ten tokio rakto nėra“.
  3. Nemaloniausia situacija yra atmintyje išsaugoto proceso arba serverio, kuriame jis yra, gedimas. Esant tokiai situacijai, prarandame visus raktus, kurie buvo saugomi talpykloje. Klasterio organizacija leidžia šiek tiek išlyginti pasekmes: daug atmintyje išsaugotų serverių, virš kurių „išsklaidyti“ projekto raktai: tokiu būdu vienos talpyklos žlugimo pasekmės bus mažiau pastebimos.

Kuriant programinę įrangą, kuri veikia su „memcached“, reikia turėti omenyje visas aprašytas situacijas. Duomenis, kuriuos saugome atmintinėje, galime padalinti pagal jų praradimo sunkumą.

"Galite prarasti". Šioje kategorijoje yra duomenų bazių pasirinkimų talpyklos. Prarasti tokius raktus nėra taip blogai, nes galime lengvai atkurti jų reikšmes vėl prisijungę prie užpakalinės programos. Tačiau dažnas talpyklos praradimas sukelia nereikalingus duomenų bazių iškvietimus.

"Aš nenorėčiau prarasti". Čia galite paminėti svetainės lankytojų skaitiklius, išteklių peržiūras ir kt. Nors kartais šių reikšmių tiesiogiai atkurti neįmanoma, šių raktų reikšmės turi ribotą laiką: po kelių minučių jų reikšmė nebeaktuali ir bus apskaičiuojama nauja reikšmė.

„Mes visai neturėtume prarasti“. „Memcached“ yra patogus naudotojo seansams saugoti – visi seansai vienodai pasiekiami iš visų serverių, įtrauktų į frontend klasterį. Taigi, aš niekada nenorėčiau prarasti seansų turinio - kitaip svetainės vartotojai bus „atsijungti“. Kaip stengtis išvengti? Galite kopijuoti seanso raktus keliuose atmintyje išsaugotuose serveriuose iš klasterio, todėl sumažėja praradimo tikimybė.

Dalintis