1 <?xml version="1.0" encoding="UTF-8"?>
3 <sect1 id="zend.cache.introduction">
4 <title>Введение</title>
6 <classname>Zend_Cache</classname> предназначен для кэширования любых данных.
9 Управление кэшированием в Zend Framework производится через фронтэнды
10 (интерфейсные части), записи кэша сохраняются через бэкэнды
11 (адаптеры <emphasis>File</emphasis>, <emphasis>Sqlite</emphasis>,
12 <emphasis>Memcache</emphasis> и др.), с использованием гибкой системы
13 идентификаторов и тегов, благодаря которым можно потом легко удалять
14 определенные типы записей
15 (например: "удалить все записи кэша, помеченные данным тегом").
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>.
24 <example id="zend.cache.introduction.example-1">
25 <title>Получение фронтэнда с помощью Zend_Cache::factory()</title>
27 <methodname>Zend_Cache::factory()</methodname> инстанцирует нужные объекты и
28 связывает их. В этом первом примере мы будем использовать
29 фронтэнд <emphasis>Core</emphasis> с бэкэндом <emphasis>File</emphasis>.
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',
50 <title>Фронтэнды и бэкэнды, содержащие несколько слов в названии</title>
52 Некоторые фронтэнды и бэкэнды имеют имена, состоящие из нескольких
53 слов, например, 'ZendPlatform'. Когда задаете их через фабрику,
54 разделяйте слова с помощью разделителей, таких, как пробел (' '),
55 тире ('-'), или точка ('.').
59 <example id="zend.cache.introduction.example-2">
60 <title>Кэширование результатов запросов к базе данных</title>
63 Теперь, имея фронтэнд, мы можем кэшировать любые типы данных,
64 используя сериализацию. Например, мы можем кэшировать результат
65 очень ресурсоемкого запроса к БД. После его добавления
66 в кэш не нужно будет даже подключаться к базе данных: записи
67 извлекаются из кэша и выполняется процедура, обратная сериализации.
69 <programlisting language="php"><![CDATA[
70 // $cache определен в предыдущем примере
72 // проверка, есть ли уже запись в кэше:
73 if(!$result = $cache->load('myresult')) {
76 // установка соединения с базой данных
78 $db = Zend_Db::factory( [...] );
80 $result = $db->fetchAll('SELECT * FROM huge_table');
82 $cache->save($result, 'myresult');
87 echo "This one is from cache!\n\n";
95 <example id="zend.cache.introduction.example-3">
96 <title>Кэширование вывода с помощью фронтэнда Zend_Cache</title>
98 Мы размечаем участки, выходные данные которых хотим поместить в кэш,
99 добавлением условной логики, окружая участок методами
100 <methodname>start()</methodname> и <methodname>end()</methodname>. Этот пример похож на
101 первый и является основной стратегией кэширования.
104 Внутри выводим данные как обычно — весь вывод будет добавлен в кэш,
105 когда будет достигнут метод <methodname>end()</methodname>. При следующем
106 запуске весь участок кода будет пропущен, вместо этого извлекаются
107 данные из кэша (до тех пор, пока записи действительны).
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',
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().').';
135 Обратите внимание, что мы выводим результат <methodname>time()</methodname>
136 дважды - это демонстрация на примере динамических данных. Попробуйте
137 запустить это и обновить страницу несколько раз, и вы заметите,
138 что первое число не изменяется, в то время как второе меняется в
139 зависимости от текущего времени. Это потому, что первое число
140 было выведено в кэшируемой части и сохранено среди других выходных
141 данных. После того, как пройдет полминуты (мы установили время жизни
142 кэша равным 30 секундам) числа снова должны стать одинаковыми, так
143 как срок действия кэша истек, сразу после этого производится новое
148 Когда используете <classname>Zend_Cache</classname>, уделяйте внимание
149 идентификатору кэша (передается методам <methodname>save()</methodname> и
150 <methodname>start()</methodname>). Он должен быть уникальным для каждого кэшируемого
151 ресурса, иначе не связанные записи кэша могут затирать друг
152 друга, или, что еще хуже, отображаться вместо других.