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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
|
<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<sect1 id="zend.cache.introduction">
<title>Wprowadzenie</title>
<para>
<classname>Zend_Cache</classname> zapewnia ogólny sposób buforowania danych.
</para>
<para>
Buforowanie w Zend Framework jest przeprowadzane przez frontendy, a
rekordy bufora są przechowywane za pomocą backendów (<emphasis>File</emphasis>,
<emphasis>Sqlite</emphasis>, <emphasis>Memcache</emphasis>...) przy użyciu uniwersalnego
systemu identyfikatorów ID oraz etykiet. Używając ich, łatwe jest
kasowanie specyficznych typów rekordów (na przykład: "usuń wszystkie
rekordy bufora oznaczone podaną etykietą").
</para>
<para>
Jądro modułu (<classname>Zend_Cache_Core</classname>) jest proste, uniwersalne i
konfigurowalne. Obecnie, dla twoich specyficznych potrzeb dostępne są
frontendy rozszerzające <classname>Zend_Cache_Core</classname> na przykład:
<emphasis>Output</emphasis>, <emphasis>File</emphasis>, <emphasis>Function</emphasis>
oraz <emphasis>Class</emphasis>.
</para>
<example id="zend.cache.introduction.example-1">
<title>Pobieranie frontendu za pomocą Zend_Cache::factory()</title>
<para>
<methodname>Zend_Cache::factory()</methodname> tworzy instancję odpowiedniego
obiektu łączy je razem. W tym pierwszym przykładzie użyjemy
frontendu <emphasis>Core</emphasis> wraz z backendem <emphasis>File</emphasis>.
</para>
<programlisting language="php"><![CDATA[
$frontendOptions = array(
'lifetime' => 7200, // okres ważności bufora 2 godziny
'automatic_serialization' => true
);
$backendOptions = array(
'cache_dir' => './tmp/' // Katalog w którym mają być składowane pliku bufora
);
// pobieranie obiektu Zend_Cache_Core
$cache = Zend_Cache::factory('Core',
'File',
$frontendOptions,
$backendOptions);
]]></programlisting>
</example>
<note>
<title>Frontendy i backendy składające się z wielu słów</title>
<para>
Niektóre frontendy i backendy są nazwane przy użyciu wielu słów, na
przykład 'ZendPlatform'. Gdy określamy ich nazwę w metodzie fabryki,
oddzielamy wyrazy używając separatora wyrazów takiego jak spacja
(' '), myślnik ('-') lub kropka ('.').
</para>
</note>
<example id="zend.cache.introduction.example-2">
<title>Buforowanie wyniku zapytania do bazy danych</title>
<para>
Teraz gdy mamy frontend, możemy buforować dowolny typ danych
(włączyliśmy serializację). Na przykład, możemy buforować wynik
bardzo obciążającego zapytania do bazy danych. Kiedy jest buforowane,
nie ma nawet potrzeby aby łączyć się z bazą; rekordy są pobierane z
bufora, a następnie odserializowane.
</para>
<programlisting language="php"><![CDATA[
// obiekt $cache zainicjalizowany jak w poprzednim przykładzie
// sprawdzamy czy bufor istnieje:
if(!$result = $cache->load('myresult')) {
// bufor nie istnieje; łączymy się z bazą
$db = Zend_Db::factory( [...] );
$result = $db->fetchAll('SELECT * FROM huge_table');
$cache->save($result, 'myresult');
} else {
// bufor istnieje! dajmy o tym znać
echo "To pochodzi z bufora!\n\n";
}
print_r($result);
]]></programlisting>
</example>
<example id="zend.cache.introduction.example-3">
<title>Buforowanie danych wyjściowych przy użyciu frontendu <classname>Zend_Cache</classname></title>
<para>
Sekcje w których chcemy buforować dane wyjściowe oznaczamy dodając
pewną warunkową logikę, ograniczającą sekcję za pomocą metod
<methodname>start()</methodname> oraz <methodname>end()</methodname> (to odpowiada
pierwszemu przykładowi i jest główną strategią buforowania).
</para><para>
Wewnątrz wyświetlaj dane jak zawsze - wszystkie dane wyjściowe będą
buforowane aż do napotkania metody <methodname>end()</methodname>. Podczas
następnego wywołania, cała sekcja będzie ominięta, a użyte zostaną
dane z bufora. (tak długo jak rekord bufora jest prawidłowy).
</para>
<programlisting language="php"><![CDATA[
$frontendOptions = array(
'lifetime' => 30, // okres ważności bufora 30 sekund
'automatic_serialization' => false // to i tak jest domyślna wartość
);
$backendOptions = array('cache_dir' => './tmp/');
$cache = Zend_Cache::factory('Output',
'File',
$frontendOptions,
$backendOptions);
// przekazujemy unikalny identyfikator do metody start()
if(!$cache->start('mypage')) {
// wyświetlamy jak zawsze:
echo 'Witajcie! ';
echo 'To jest buforowane ('.time().') ';
$cache->end(); // dane wyjściowe są zapisywane i wysyłane do przeglądarki
}
echo 'To nie jest nigdy buforowane ('.time().').';
]]></programlisting>
<para>
Zauważ, że wyświetlamy rezultat funkcji <methodname>time()</methodname> dwa razy;
jest to coś dynamicznego, aby zademenstrować przeznaczenie. Spróbuj
uruchomić to i odświeżyć kilka razy; zauważysz, że pierwsza liczba
się nie zmienia, a druga za każdym razem jest inna. Tak jest ponieważ
pierwsza liczba była wyświetlona w sekcji buforowanej więc została
zapisana. Po upływie pół minuty (ustawiliśmy okres ważności bufora na
30 sekund) powinny ponownie się zgadzać ponieważ bufor wygasł -- i
został zapisany ponownie. Powinieneś to sprawdzić w swojej
przeglądarce lub w konsoli.
</para>
</example>
<note><para>
Kiedy używasz Zend_Cache, zwracaj uwagę na ważny identyfikator bufora
(przekazany do metod <methodname>save()</methodname> oraz <methodname>start()</methodname>).
Musi być unikalny dla każdego zasobu, który buforujesz, inaczej nie
powiązane buforowane rekordy mogą się nawzajem ścierać, lub gorzej,
jeden może wyświetlić się w miejscu drugiego.
</para></note>
</sect1>
|