EpicWEB.pl

webdesign, programowanie, phat lewt!

Ostatni projekt

ddrpl.com

Ostatnie wiadomości

XCache - cachowanie zmiennych

W poprzednim wpisie poruszyłem temat wykorzystania XCache jako rozszerzenia do cachowania danych w PHP. Temat przechowywania wartości zmiennych był tam tylko lekko poruszony, jednak ostatnio sytuacja zmusiła mnie do ponownego rozpatrzenia sprawy.

Parę dni temu odbyły się polskie eliminacje do Eurowizji - jako, że strona eurowizja.com.pl, która utrzymywana jest na jednym z moich serwerów, w ciągu dwóch dni (dzień eliminacji i dzień po) wygenerowała 4 razy więcej ruchu niż w całym styczniu, serwer zaczął ledwo zipać. Postanowiłem zakasać rękawy i użyć cachowania zmiennych do przechowywania często pobieranych, ale nie często modyfikowanych informacji.

Konfiguracja PHP

Pierwsze co musimy zrobić, to zmodyfikować ponownie nasz pliki php.ini aktywując cachowanie zmiennych:

xcache.var_size = 4M
xcache.var_count = 1
xcache.var_slots = 8K
xcache.var_ttl = 3600
xcache.var_maxttl = 0
xcache.var_gc_interval = 300

Większość zmiennych konfiguracyjnych jest bardzo podobna do omawianych w poprzednim artykule, więc w razie wątpliwości odsyłam do owego wpisu. Pojawiają się właściwie dwie nowe:

xcache.var_maxttl - określa maksymalny czas życia zmiennej, jaki możemy ustawić podczas jej definiowania
xcache.var_gc_interval - określa częstotliwość (w sekundach) z jaką powinien być uruchamiany Garbage Collector, którego zadaniem jest usuwanie nie używanych danych z pamięci

Nowe funkcje z rozszerzenia XCache

Kiedy już mamy wszystko poprawnie skonfigurowane (i zresetowaliśmy serwer www!) możemy przystąpić do przerabiania naszej aplikacji. Przydadzą nam się teraz 4-ry funckje dodane przez XCache do PHP:

bool xcache_isset(string name)
bool xcache_unset(string name)
int xcache_inc(string name [, int value [, int ttl]])
int xcache_dec(string name [, int value [, int ttl]])

Przy ich pomocy możemy odpowiednio zmodyfikować nasze skrypty tak, by dane, które są nam potrzebne ale trudne do zdobycia (wymagają dużego nakładu na SQL, znajdują się na innym serwerze etc.) były zawsze pod ręką.

Przykład użycia

Poniżej zamieszczam przykładowy kod, który pobiera dane z bazy SQL tylko wtedy, kiedy ich potrzebuje.

<?
// dołącz nagłówki, połączenia z bazą etc.
if(!xcache_isset('xcache_data')) { // 1
$data = pobierzBardzoWazneDaneZSQL();
xcache_set('xcache_data', $data, 3600); // 2
}
else $data = xcache_get('xcache_data'); // 3

Krótkie wyjaśnienie

  1. Sprawdzamy, czy XCache przechowuje jakieś zmienne w swojej prywatnej zmiennej xcache_data
  2. Zapisujemy nasze informacje w zmiennej xcache_data i zastrzegamy, że dane te mają być uważane za aktualne przez najbliższe 3600 sekund (godzinę)
  3. Jeżeli jednak dane są przechowywane w pamięci podręczne, pobieramy je z niej

Należy zwrócić uwagę na dwie rzeczy:

  1. Nazwa zmiennej, w jakiej my przechowujemy dane nie jest nazwą zmiennej, pod jaką są one przechowywane w xcache!
  2. Ponieważ możmy zapisać dane pod dowolną nazwą w xcache polecam stosowanie prefixów, tak by przypadkiem nie nadpisać sobie danych w innym ppliku / skrypcie. Ja osobiście używam prefixu będącego wynikiem md5() ze stałej __FILE__ co powoduje prawie pewną unikalność nazw zmiennych

Usuwanie danych z cache

W naszym skrypcie zdecydowaliśmy, że dane mają być przechowywane w xache przez minutę (patrz pkt. 1) - oc jeżeli dane zostaną przez nas umyślnie zmodyfikowane (np. aktualność zostanie zaktualizowana, ktoś zagłosuje w sondzie)? Do pomocy mamy dwa mechanizmy:

  1. Możemy zalogować się do XCache Admin (więcej na ten temat w poprzednim wpisie)
  2. Możemy użyć funkcji xcache_unset do usunięcia zmiennej z cache

Podsumowanie

Po zastosowaniu XCache na wspomnianej stronie Eurowizji stabilność serwera uległa zdecydowanemu polepszeniu - ilość wątków Apache i MySQL spadła o połowę, load wrócił do normy, a ja nie zobaczyłem już więcej wiadomości “strona nie działa!” od klienta :-)

Zostaw komentarz