Ostatnio dużo myślę o optymalizacji moich stronek i ulepszeniu mojego cms’a, stąd kolejny art o cachowaniu tym razem będzie mowa o Zend Cache.
Jako że pracuje na Zend framework z podłaczonym systemem szablonów Smarty rozpatruje użycie jednego z dwóch dostępnych dla mnie rozwiązań czyli Zend Cache i Cache smarty.
Wcześniej nie widziałem potrzeby buforowania szablonów, nie było mi to raczej potrzebne ale w miarę wzrastania cmsa i projektów którymi się zajmuje postanowiłem to zmienić.
Ale do rzeczy …
Zend cache można zainicjować w bardzo prosty sposób i ustawiając na początek kilka opcji
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
//includujemy plik z klasą Zend_Cache
require_once 'Zend/Cache.php';
//ustawiamy opcje frontend
$frontendOptions = array(
'lifetime' => 7200, // czas życia cacha
'automatic_serialization' => true //włączmy automatyczną serializacje domyśnie ustawiona jest na false
);
//ustawiamy opcje backend
$backendOptions = array(
'cache_dir' => './tmp/' // folder gdzie będziemy przechowywać pliki cacha
);
//frontend czyli to co chcemy cachować
//dostępne opcje: Core, Output, Class, File, Function, Page
$frontend = 'Core';
//backend czyli to gdzie chcemy cachować
//dostępne opcje: File, Sqlite, Memcached, Apc, ZendPlatform
$backend = 'File';
// odpalamy cacha za pomocą metody factory
$cache = Zend_Cache::factory($frontend, $backend, $frontendOptions, $backendOptions); |
Opcję $frontend = ‘Core’ możemy zastosować do buforowania zapytań do bazy danych np.
1
2
3
4
5
6
7
8
9
10
11
12
|
if(!$result = $cache->load('myresult')) {
// gdy nie macacha pobieramy dane z bazy
$result = $db->fetchAll('SELECT * FROM huge_table');
// i zapisujemy cache
$cache->save($result, 'myresult');
}
//dane możemy dalej przetwarzać lub wydrukować
print_r($result); |
Do cachowania wyjścia używamy trochę innych metod (start i end):
1
2
3
4
5
6
7
8
9
10
11
12
|
//ustawiamy opcję Output w metodzie factory
$cache = Zend_Cache::factory('Output', 'File', $frontendOptions, $backendOptions);
// do metody start musimy przekazać unikalny identyfikator
if(!$cache->start('mypage')) {
echo 'Hello world! ';
echo 'This is cached ('.time().') ';
$cache->end(); // zapisujemy wyjście i wysyłąmy do przegklądarki
echo 'This is never cached ('.time().').'; |
Tagi
Zend Cache ma przydatną opcję tagowania cacha, pomocne jest to do kategoryzowania buforów i przydatne przyczyszczeniu określonych grup (kategorii) cachy.
1
2
|
$cache->save($dane, 'uniqueID', array('tagA', 'tagB', 'tagC')); |
Czyszczenie cachy
Zeby usunąć cache o określonym id wystarczy użyć metody
1
2
|
$cache->remove('idDoUsuniecia'); |
Żeby usunąć większą ilość zbuforowanych danych można się posłużyć metodą clean(), przyczym metoda ta może przyjmować różne przydatne opcje.
Do usunięcia wszystkich buforów użyjemy opcji Zend_Cache::CLEANING_MODE_ALL.
1
2
|
$cache->clean(Zend_Cache::CLEANING_MODE_ALL); |
Do usunięcia starych (wygasłych) buforów użjemy clean() z opcją Zend_Cache::CLEANING_MODE_OLD
1
2
|
$cache->clean(Zend_Cache::CLEANING_MODE_OLD); |
Do usunięcia buforów oznaczonych tagami Zend_Cache::CLEANING_MODE_MATCHING_TAG
1
2
|
$cache->clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG, array('tagA', 'tagC')); |
Do usunięcia buforów nie oznaczonych danymi tagami CLEANING_MODE_NOT_MATCHING_TAG (podajemy również tablicę tagów)
1
2
|
$cache->clean(Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG, array('tagA', 'tagC')); |
Zend Cache posiada jeszcze kilka ciekawych opcji, ale te opisane powyżej w zupełności wystarczą by używać tego narzędzia.
admin PHP buforowanie, cache zend, zend framework