XCache - wprowadzenie do mechanizmu cache w PHP
Cache (pamięć podręczna) to mechanizm, w którym ostatnio pobierane dane dostępne ze źródła o wysokiej latencji i niższej przepustowości są przechowywane w pamięci o lepszych parametrach.
Wiedząc już czym będziemy się zajmować przejdźmy do możliwości.
XCache pozwala nam na cachowanie 2 typów danych:
- zmienne oraz obiekty - w każdej chwili możemy zapisać oraz odczytać z cache wartość zmiennej czy też typ złożony (tablica, obiekt)
- skompilowane pliki PHP - każdy plik PHP przed wykonaniem przechodzi przez fazę kompilacji, w któej zamieniany jest na kod maszynowy - XCache pozwala nam pa pominięcie tego kroku i przechowuje w pamięci już skompilowany kod
Instalacja na platformie Linux
Jako, że mój serwer korzysta z SuSE Linux skupię się na instalacji dla tego właśnie środowiska - instalacja na innych platformach powinna być bardzo podobna.
Proces instalacji zaczynamy od pobrania paczki bądź źródła. Zakładam, drogi czytelniku, że wiesz jak kompiluje się programy więc nie będę opisywał tego procesu ;-)
Kiedy już mamy pliki u siebie odnajdujemy plik xcache.so i kopiujemy go do folderu, zawierającego rozszerzenia dla PHP - u mnie jest to /usr/lib/php5/extensions/
Następnie, dodajemy zawartość pliku xcache.ini do naszego php.ini, można to robić komendą:
cat xcache.ini >> /sciezka/do/php.ini
Co spowoduje dopisanie danych na koniec. W tym momencie możemy już zrestartować nasz serwer i cieszyć się z nowego rozszerzenia. Proponuję jednak doczytać kolejne akapity i skonfigurować XCache wg. naszych potrzeb.
Cachowanie zmiennych
Do pierwszego zastosowania służą nam głównie 2 funkcje:
bool xcache_set(string name, mixed value [, int ttl]) - pozwala na zapisanie zdefiniowanej zmiennej pod nazwą name nadając jej wartość value, dodatkowo, możemy podać 3-ci parametr ttl określający ilość sekund, po których wartość powinna zostać usunięta z cache
mixed xcache_get(string name) - funkcja zwracająca dane uprzednio zapisane w cache
Dodatkowo możemy korzystać jeszcze z funkcji nie wymagających dokładniejszego wyjaśnienia czyli:
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]])
Dwie ostatnie funkcje odpowiednio zwiększają oraz zmniejszają wartość zapisanej zmiennej.
Cachowanie plików PHP
Do drugiego zastosowania nie są potrzebne nam praktycznie żadne funkcje. Po zainstalowaniu i skonfigurowaniu (uwaga - domyślnie cachowanie tego typu jest wyłączone!) rozszerzenie samo zadba o wypełnianie oraz usuwanie cache w razie potrzeby. Sposób działania możemy modyfikować poprzez następujące dyrektywy konfiguracyjne:
xcache.size - określa całkowitą ilość pamięci, którą przeznaczamy na cache
xcache.count - ile oddzielnych jednostek / wątków cache utworzyć (autorzy sugerują, by liczba ta była równa ilości procesorów/rdzeni)
xcache.slots - minimalna wielkość slotu przeznaczona na jeden plik - każdy plik może zajmować więcej niż jeden slot, ale żaden nie może zająć mniej
xcache.ttl - ilość sekund, przez ile dany plik może być maksymalnie przechowywany w cache
U mnie wartości te wyglądają następująco:
xcache.size = 64M
xcache.count = 4
xcache.slots = 8K
xcache.ttl = 3600
Średnie wykorzystanie wynosi 60-70%, a ilość zapchań (clogs - są to sytuacje, w których następuje żądanie pliku, który powinien już znaleźć się w cache, ale wciąż trwa jego kompilacja) nie przekracza 10 na jednostkę (czyli około 0.1%)
Administracja - XCache Admin
W folderze z XCache znajdziemy też katalog admin zawierający prosty panel administracyjny pozwalający na przeglądanie statystyk, nazw przetrzymywanych plików oraz zmiennych (w wypadku tych ostatnich - także na ich modyfikację!) Zanim skorzystamy z panelu administracyjnego, musimy zmienić jeszcze kilka rzeczy w php.ini, a mianowicie:
[xcache.admin]
xcache.admin.enable_auth = On
xcache.admin.user = “login_administratora”
xcache.admin.pass = “tu_wstaw_wynik_md5(twoje_haslo)”
Po takim zabiegu musimy jeszcze tylko zresetować serwer.
Kilka słów na zakończenie
Należy zwrócić uwagę, że wszelkie zmienne cachowane są globalnie. Co to znaczy? Każda zcachowana zmienna dostępna jest dla dowolnego wątku PHP - oznacza to, że jeżeli użytkownik A zapisze jakąś zmienną do cache, użytkownik B może ją bez problemu odczytać (dotyczy to tylko zmiennych! pliki nie są cachowane w ten sposób) używając xcache_get! Dodatkowo, jeżeli dwa różne skrypty (lub nawet dwa takie same skrypty - np. gotowe fora internetowe) używają cache będą one dzielić wszystkie dane! By uniknąć tego typu działania sugeruję użyć prostego wrappera do funkcji, który przez zapisaniem lub odczytaniem zmiennej o danej nazwie odpowiednio ją zmodyfikuje - np.:
<?
function myCache_set($name, $value, $ttl = null) {
$salt = "moj_prywatny_skrypt_";
return xcache_set($salt.$name, $value, $ttl);
}