[ZF-10089] Zend_Log
[zend.git] / documentation / manual / ru / module_specs / Zend_Cache-Introduction.xml
blob6653cacce622710cf831d4cef4a6da53a2177b56
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- Reviewed: no -->
3 <sect1 id="zend.cache.introduction">
4     <title>Введение</title>
5     <para>
6         <classname>Zend_Cache</classname> предназначен для кэширования любых данных.
7     </para>
8     <para>
9         Управление кэшированием в Zend Framework производится через фронтэнды
10         (интерфейсные части), записи кэша сохраняются через бэкэнды
11         (адаптеры <emphasis>File</emphasis>, <emphasis>Sqlite</emphasis>,
12         <emphasis>Memcache</emphasis> и др.), с использованием гибкой системы
13         идентификаторов и тегов, благодаря которым можно потом легко удалять
14         определенные типы записей
15         (например: "удалить все записи кэша, помеченные данным тегом").
16     </para>
17     <para>
18         Ядро модуля (<classname>Zend_Cache_Core</classname>) является гибким,
19         универсальным и конфигурируемым. Кроме этого, для особых нужд есть
20         фронтэнды, расширяющие
21         <classname>Zend_Cache_Core</classname>: <emphasis>Output</emphasis>,
22         <emphasis>File</emphasis>, <emphasis>Function</emphasis> и <emphasis>Class</emphasis>.
23     </para>
24     <example id="zend.cache.introduction.example-1">
25         <title>Получение фронтэнда с помощью Zend_Cache::factory()</title>
26         <para>
27             <methodname>Zend_Cache::factory()</methodname> инстанцирует нужные объекты и
28             связывает их. В этом первом примере мы будем использовать
29             фронтэнд <emphasis>Core</emphasis> с бэкэндом <emphasis>File</emphasis>.
30        </para>
31         <programlisting language="php"><![CDATA[
32 $frontendOptions = array(
33    'lifetime' => 7200, // время жизни кэша - 2 часа
34    'automatic_serialization' => true
37 $backendOptions = array(
38     'cache_dir' => './tmp/' // директория, в которой размещаются файлы кэша
41 // получение объекта Zend_Cache_Core
42 $cache = Zend_Cache::factory('Core',
43                              'File',
44                              $frontendOptions,
45                              $backendOptions);
46 ]]></programlisting>
47     </example>
49     <note>
50         <title>Фронтэнды и бэкэнды, содержащие несколько слов в названии</title>
51         <para>
52             Некоторые фронтэнды и бэкэнды имеют имена, состоящие из нескольких
53             слов, например, 'ZendPlatform'. Когда задаете их через фабрику,
54             разделяйте слова с помощью разделителей, таких, как пробел (' '),
55             тире ('-'), или точка ('.').
56         </para>
57     </note>
59     <example id="zend.cache.introduction.example-2">
60         <title>Кэширование результатов запросов к базе данных</title>
62         <para>
63             Теперь, имея фронтэнд, мы можем кэшировать любые типы данных,
64             используя сериализацию. Например, мы можем кэшировать результат
65             очень ресурсоемкого запроса к БД. После его добавления
66             в кэш не нужно будет даже подключаться к базе данных: записи
67             извлекаются из кэша и выполняется процедура, обратная сериализации.
68        </para>
69         <programlisting language="php"><![CDATA[
70 // $cache определен в предыдущем примере
72 // проверка, есть ли уже запись в кэше:
73 if(!$result = $cache->load('myresult')) {
75     // промах кэша
76     // установка соединения с базой данных
78     $db = Zend_Db::factory( [...] );
80     $result = $db->fetchAll('SELECT * FROM huge_table');
82     $cache->save($result, 'myresult');
84 } else {
86     // попадание в кэш
87     echo "This one is from cache!\n\n";
91 print_r($result);
92 ]]></programlisting>
93     </example>
95     <example id="zend.cache.introduction.example-3">
96         <title>Кэширование вывода с помощью фронтэнда Zend_Cache</title>
97         <para>
98             Мы размечаем участки, выходные данные которых хотим поместить в кэш,
99             добавлением условной логики, окружая участок методами
100             <methodname>start()</methodname> и <methodname>end()</methodname>. Этот пример похож на
101             первый и является основной стратегией кэширования.
102         </para>
103         <para>
104             Внутри выводим данные как обычно — весь вывод будет добавлен в кэш,
105             когда будет достигнут метод <methodname>end()</methodname>. При следующем
106             запуске весь участок кода будет пропущен, вместо этого извлекаются
107             данные из кэша (до тех пор, пока записи действительны).
108        </para>
109         <programlisting language="php"><![CDATA[
110 $frontendOptions = array(
111    'lifetime' => 30,                   // время жизни кэша - 30 секунд
112    'automatic_serialization' => false  // уже установлено по умолчанию
115 $backendOptions = array('cache_dir' => './tmp/');
117 $cache = Zend_Cache::factory('Output',
118                              'File',
119                              $frontendOptions,
120                              $backendOptions);
122 // передаем уникальный идентификатор методу start()
123 if(!$cache->start('mypage')) {
124     // производим вывод, как обычно:
126     echo 'Hello world! ';
127     echo 'This is cached ('.time().') ';
129     $cache->end(); // выходные данные сохранены и отправлены броузеру
132 echo 'This is never cached ('.time().').';
133 ]]></programlisting>
134        <para>
135            Обратите внимание, что мы выводим результат <methodname>time()</methodname>
136            дважды - это демонстрация на примере динамических данных. Попробуйте
137            запустить это и обновить страницу несколько раз, и вы заметите,
138            что первое число не изменяется, в то время как второе меняется в
139            зависимости от текущего времени. Это потому, что первое число
140            было выведено в кэшируемой части и сохранено среди других выходных
141            данных. После того, как пройдет полминуты (мы установили время жизни
142            кэша равным 30 секундам) числа снова должны стать одинаковыми, так
143            как срок действия кэша истек, сразу после этого производится новое
144            сохранение в кэш.
145        </para>
146     </example>
147     <note><para>
148         Когда используете <classname>Zend_Cache</classname>, уделяйте внимание
149         идентификатору кэша (передается методам <methodname>save()</methodname> и
150         <methodname>start()</methodname>). Он должен быть уникальным для каждого кэшируемого
151         ресурса, иначе не связанные записи кэша могут затирать друг
152         друга, или, что еще хуже, отображаться вместо других.
153     </para></note>
154 </sect1>
155 <!--
156 vim:se ts=4 sw=4 et: