Zend_Cache_Core
jest specjalnym frontendem ponieważ
jest on jądrem modułu. Jest on podstawowym frontendem bufora i
jest rozszerzany przez inne klasy.
Notatka | |
---|---|
Wszystkie frontendy dziedziczą z klasy |
Te opcje są przekazywane do metody fabryki jako pokazano w poprzednich przykładach.
Tabela 4.1. Dostępne opcje
Opcja | Typ danych | Domyślna wartość | Opis |
---|---|---|---|
caching |
boolean |
true |
włącza / wyłącza buforowanie (może być użyteczne do sprawdzania buforowanych skryptów) |
lifetime |
int |
3600 |
okres ważności bufora (w sekundach), jeśli ustawiony na
null , bufor będzie ważny na zawsze
|
logging |
boolean |
false |
jeśli ma wartość true, aktywowane jest logowanie za pomocą
Zend_Log is activated (ale system jest wolniejszy)
|
write_control |
boolean |
true |
Włącza / wyłącza kontrolę zapisu (bufor jest odczytywany zaraz po zapisaniu aby wykryć uszkodzone wpisy), włączając kontrolę zapisu lekko zwolniesz zapisywanie bufora, ale nie będzie to miało wpływu na jego odczytywanie (może to wykryć niektóre uszkodzone pliki bufora, ale nie jest to perfekcyjna kontrola) |
automatic_serialization |
boolean |
false |
Włącza / wyłącza serializację, może być użyte do bezpośredniego zapisywania danych, które nie są łańcuchami znaków (ale jest to wolniejsze) |
automatic_cleaning_factor |
int |
10 |
Włącza / ustawia proces automatycznego czyszczenia (garbage collector): 0 oznacza brak automatycznego czyszczenia, 1 oznacza systematyczne czyszczenie bufora, a x > 1 oznacza automatyczne losowe czyszczenie 1 raz na x operacji zapisu. |
Przykład jest podany w dokumentacji na samym początku.
Jeśli w buforze przechowujesz tylko łańcuchy znakow (ponieważ z opcją "automatic_serialization" możliwe jest przechowywanie wartości logicznych), możesz użyć bardziej kompaktowej konstrukcji:
<?php // zakładamy, że mamy już obiekt $cache $id = 'myBigLoop'; // id bufora czyli "tego co chcemy buforować" if (!($data = $cache->load($id))) { // brak bufora $data = ''; for ($i = 0; $i < 10000; $i++) { $data = $data . $i; } $cache->save($data); } // [...] przetwarzaj dane $data (wyświetl je, przekaż itp.) ?>
Jeśli chcesz buforować wiele bloków lub instancji danych, idea jest ta sama:
<?php // upewnij się, że używasz unikalnych identyfiikatorów: $id1 = 'foo'; $id2 = 'bar'; // blok 1 if (!($data = $cache->load($id1))) { // brak bufora $data = ''; for ($i=0;$i<10000;$i++) { $data = $data . $i; } $cache->save($data); } echo($data); // to nigdy nie jest buforowane echo('NEVER CACHED! '); // blok 2 if (!($data = $cache->load($id2))) { // brak bufora $data = ''; for ($i=0;$i<10000;$i++) { $data = $data . '!'; } $cache->save($data); } echo($data); ?>
Zend_Cache_Frontend_Output
jest frontendem przechwytującym
dane wyjściowe. Przejmuje on wyświetlanie danych wyjściowych w PHP
przechwytując wszystko co jest pomiędzy metodami start()
oraz end()
.
Ten frontend nie ma żadnych specyficznych opcji innych niż te
z Zend_Cache_Core
.
Przykład jest podany w dokumentacji na samym początku. To są główne różnice:
<?php // jeśli bufor nie istnieje, przechwytywane są dane wyjściowe if (!($cache->start('mypage'))) { // wyświetlaj jak zawsze echo 'Witaj! '; echo 'To jest buforowane ('.time().') '; $cache->end(); // kończy się wyświetlanie danych } echo 'To nie jest nigdy buforowane ('.time().').'; ?>
Używając tej formy bardzo łatwe jest ustawienie buforowania danych wyjściowych w twoim aktualnie działającym projekcie przy małej ilości przeróbek w kodzie lub przy ich braku.
Frontend Zend_Cache_Frontend_Function
buforuje
rezultaty wywołań funkcji. Posiada on jedną metodą nazwaną
call()
, ktora przyjmuje nazwę funkcji oraz
parametry do wywołania w tablicy.
Tabela 4.2. Dostępne opcje
Opcja | Typ danych | Domyślna wartość | Opis |
---|---|---|---|
cacheByDefault |
boolean |
true |
jeśli ma wartość true, wywołania funkcji będą domyślnie buforowane |
cachedFunctions |
array |
nazwy funkcji które mają być zawsze buforowane | |
nonCachedFunctions |
array |
nazwy funkcji które nigdy nie mają być buforowane |
Użycie funkcji call()
jest takie samo jak użycie
funkcji call_user_func_array()
w PHP:
<?php $cache->call('veryExpensiveFunc', $params); # $params jest tablicą # przykładowo aby wywołać (z buforowaniem) funkcję veryExpensiveFunc(1, 'foo', 'bar'), użyj # $cache->call('veryExpensiveFunc', array(1, 'foo', 'bar')) ?>
Frontend Zend_Cache_Frontend_Function
jest na tyle sprytny,
że buforuje zarówno wartość zwracaną przez funkcję, jak i wszystkie
dane wyjściowe, które ona wypisuje.
Notatka | |
---|---|
Możesz przekazać dowolną wbudowaną funkcję lub zdefiniowną przez
użytkownika z wyjątkiem |
Frontend Zend_Cache_Frontend_Class
różnie się od
frontendu Zend_Cache_Frontend_Function
tym, że
umożliwia buforowanie wywołań metod obiektów (także statycznych)
Tabela 4.3. Dostępne opcje
Opcja | Typ danych | Domyślna wartość | Opis |
---|---|---|---|
cachedEntity (wymagane) |
mixed |
jeśli ustawiona jest nazwa klasy, będziemy buforować klasę abstrakcyjną i używać tylko statycznych wywołań; jeśli ustawiony jest obiekt będziemy buforować metody tego obiektu | |
cacheByDefault |
boolean |
true |
jeśli ma wartość true, wywołania będą domyślnie buforowane |
cachedMethods |
array |
nazwy metod które mają być zawsze buforowane | |
nonCachedMethods |
array |
nazwy metod które nie mają być nigdy buforowane |
Na przykład, aby buforować statyczne wywołania:
<?php class test { # metoda statyczna public static function foobar($param1, $param2) { echo "foobar_output($param1, $param2)"; return "foobar_return($param1, $param2)"; } } // [...] $frontendOptions = array( 'cachedEntity' => 'test' // Nazwa klasy ); // [...] # buforowane wywołanie $res = $cache->foobar('1', '2'); ?>
Aby buforować klasyczne wywołania metod:
<?php class test { private $_string = 'hello !'; public function foobar2($param1, $param2) { echo($this->_string); echo "foobar2_output($param1, $param2)"; return "foobar2_return($param1, $param2)"; } } // [...] $frontendOptions = array( 'cachedEntity' => new test() // instancja klasy ); // [...] # buforowane wywołanie $res = $cache->foobar2('1', '2'); ?>
Zend_Cache_Frontend_File
jeest frontendem działającym
w oparciu o datę modyfikacji "głównego pliku". Jest to bardzo
interesujące, na przykład przy zagadnieniach związanych z konfiguracją
czy szablonami.
Na przykład, jeśli masz plik konfiguracyjny XML, który jest analizowany
przez funkcję zwracającą obiekt konfiguracji (na przykład Zend_Config
).
Za pomocą frontendu Zend_Cache_Frontend_File
, możesz przechować
obiekt konfiguracji w buforze (aby zapobiec analizowaniu pliku konfiguracyjnego
XML za każdym razem), ale przy zależności od "głównego pliku".
Więc jeśli plik konfiguracyjny XML zostanie zmodyfikowany, bufor natychmiast
straci ważność.
Frontend Zend_Cache_Frontend_Page
działa jak Zend_Cache_Frontend_Output
ale jest zaprojektowany dla kompletnej strony. Nie jest możliwe użycie Zend_Cache_Frontend_Page
do buforowania pojedynczego bloku.
Z drugiej strony, identyfikator bufora jest obliczany na podstawie
$_SERVER['REQUEST_URI']
oraz (zależnie od opcji)
$_GET
, $_POST
, $_SESSION
, $_COOKIE
, $_FILES
.
Jeszcze lepiej, masz tylko jedną metodę do wywołania (start()
)
ponieważ metoda end()
jest wywoływana w pełni automatycznie
na końcu strony.
Obecnie nie jest to zaimplementowane, ale planujemy dodać warunkowy system HTTP w celu oszczędzania transferu (system wyśle nagłówek HTTP 304 Not Modified jeśli bufor istnieje i gdy przeglądarka ma aktualną wersję bufora).
Tabela 4.5. Dostępne opcje
Opcja | Typ danych | Domyślna wartość | Opis |
---|---|---|---|
http_conditional |
boolean |
false |
użyj systemu http_conditional (obecnie jeszcze nie zaimplementowane) |
debug_header |
boolean |
false |
jeśli ma wartość true, testowy tekst jest dodawany przed każdą buforowaną stroną |
default_options |
array |
array(...zobacz niżej...) |
asocjacyjna tablica domyślnych opcji:
|
regexps |
array |
array() |
tablica asocjacyjna do ustawienia opcji tylko dla pewnych adresów REQUEST_URI, klucze są wyrażeniami regularnymi (PCRE), wartości są asocjacyjnymi tablicami ze specyficznymi opcjami do ustawienia gdy wyrażenie regularne zostanie dopasowane do $_SERVER['REQUEST_URI'] (zobacz default_options aby zobaczyć listę wszystkich dostępnych opcji) ; jeśli kilka wyrażen regularnych będzie pasowało do $_SERVER['REQUEST_URI'], zostanie użyte tylko te ostatnie |
Użycie Zend_Cache_Frontend_Page jest naprawdę łatwe:
<?php // [...] // wymagane, konfiguracja i fabryka $cache->start(); // jeśli bufor jest trafiony, wynik jest wysyłany do przeglądaki a skrypt tutaj kończy działanie // reszta strony ?>
bardziej kompleksowy przykład, który pokazuje sposób centralnego zarządzania buforowaniem w pliku ładującym (przykładowo do użycia z klasą Zend_Controller)
<?php // [...] powinieneś unikać tworzenia dużej ilości kodu przed sekcją buforowania // [...] na przykład, w celu optymalizacji, instrukcje "require_once" lub "Zend_Loader::loadClass" // [...] powinny znajdować się za sekcją buforowania require_once 'Zend/Cache.php'; $frontendOptions = array( 'lifetime' => 7200, 'debug_header' => true, // dla testów 'regexps' => array( '^/$' => array('cache' => true), // buforuj cały kontroler IndexController '^/index/' => array('cache' => true), // buforuj cały kontroler IndexController '^/article/' => array('cache' => false), // nie buforuj kontrolera ArticleController... '^/article/view/' => array( // ...ale buforuj akcję "view" 'cache' => true, // kontrolera ArticleController 'cache_with_post_variables' => true, // i buforuj gdy są dostępne zmienne $_POST 'make_id_with_post_variables' => true, // (ale bufor będzie zależał od tablicy $_POST) ) ) ); $backendOptions = array( 'cache_dir' => '/tmp/' ); // pobieranie obiektu Zend_Cache_Frontend_Page $cache = Zend_Cache::factory('Page', 'File', $frontendOptions, $backendOptions); $cache->start(); // jeśli bufor jest trafiony, wynik jest wysyłany do przeglądaki a skrypt tutaj kończy działanie // [...] koniec pliku uruchamiającego (te linie nie będą wykonane jeśli bufor jest trafiony) ?>