Na pewno często zastanawialiśmy się nad sposobem przyspieszenia swoich witryn internetowych. Wielu z nas korzysta z cahcowania na plikach, jednakże nie zawsze to zdaje egzamin. Dziś chciałbym poruszyć alternatywę czyli memcached. Pozwala on na buforowanie wszelakich danych w pamięci ram, dzieki czemu jest niebotycznie szybki. W odróżnieniu od takich pakietów jak APC, eAccelerator czy JPCache, jego głównym zadaniem nie jest buforowanie stron wyjściowych, tylko samych danych. Z racji iż jestem zwolennikiem buforowania danych(a nie całych stron), odpowiada mi on w stu procentach. Główną przyczyną tego stanu jest to, że często te same dane pobieramy wielokrotnie zmieniająć ich wygląd na wyjściu.
Aby móc w pełni korzystać z dobrodziejst jakimi obdarza nas memcached, potrzebujemy serwera, ponieważ musi on działać w tle non-stop. Jeżeli korzystamy z systemu Linux pobierzemy go z tej strony http://www.danga.com/memcached/ lub znajdziemy najpradopodobniej w repozytoriach, jeżeli jesteś użytkownikiem Windowsa wypada zajrzeć tutaj http://jehiah.cz/projects/memcached-win32/. Po instalacji demona, potrzebujemy do szczęścia jeszcze biblioteki pecl do php. Fedora posiada gotową wersje w swoim repozytorium, nazywa się ona php-pecl-memcache, jak jednak nam się nie poszczęściło to musimy pobrać z http://pecl.php.net/package/memcache lub zainstalować korzystając z polecenia:
extension="memcache.so"
Dla windows:
extension=php_memcache.dll
Kiedy mamy wszystko zainstalowane z powodzeniem uruchomiliśmy demona/usługę memcached, możemy rozpocząć prace z nim.
Jak już pisałem za pomoca mamcached możemy buforowac wszystko od liczb, stringów po nawet obiekty z wyjątkiem tak jak przy serializacji danych, niestety nie uda nam się zbuforowac zasobów, czyli np. połączeń z bazą danych. W przypadku obiektów problem ten można wygodnie rozwiązać za pomocą metod magicznych __sleep() oraz __wakeup(). Kiedy już wiemy co możemy umieścić w cache'u przejdziemy do samej biblioteki memcache, a mianowicie dostarcza ona nam klasę Memcache, która obsługuje serwer. Więc aby nawiązać połączenie musimy najpierw utworzyć obiekt klasy i wywołać metodę connect().
<?php
$cache=new Memcache;
$cache->connect('localhost');
?><?php
class Licznik
{
private $count=0;
//metoda zwiekszająca licznik o jeden
public function incCount(){
$this->count++;
}
//metoda zwracająca nam aktualny stan licznika
public function getCount(){
return $this->count;
}
}
$cache=new Memcache;
$cache->connect('localhost');
$l=$cache->get('licznik');
if($l===false){
$l=new Licznik;
$cache->add('licznik',$l,MEMCACHE_COMPRESSED,300);
} else {
$l->incCount();
$cache->set('licznik',$l,MEMCACHE_COMPRESSED,300);
}
echo 'Obecny stan licznika wynosi: '.$l->getCount();
$cache->close();
?><?php
if('1234'==1234) { echo 'Prawda'; } else { echo 'Fałsz'; } //zwróci prawdę
if('1234'===1234) { echo 'Prawda'; } else { echo 'Fałsz'; } //zwróci fałsz
?>Sam licznik moglibyśmy wykonac dużo prościej z pomoca memcached. Otóż nasza biblioteka z dostarcza dwie metody do wygodnej obsługi counterów - increment() i decrement(). Obie moga przyjmowac dwa argumenty, ostni jest opcjonalny i określa o ile ma się podnieść lub zmaleć wartość o nazwie określonej pierwszym argumentem metody. Przykład nasz wygladałby wtedy tak:
<?php
$cache=new Memcache;
$cache->connect('localhost');
if($cache->increment('licznik')){
$cache->add('licznik',0);
}
echo 'Obecny stan licznika wynosi: '.$cache->get('licznik');
$cache->close();
?>Innymi przydatnymi metodami będą:
<?php $cache->flush(); ?><?php $cache->delete('licznik'); ?>. Funkcja zwraca true w przypadku powodzenia lub false jeżeli z jakis przyczyn nie można usunąć elementu, tudziez nie istnieje.Opis innych metod możemy znaleźć w dokumentacji php pod adresem http://pl.php.net/manual/pl/book.memcache.php.
Dodaj nową odpowiedź