| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- <sect1 id="zend.cache.introduction">
- <title>Введение</title>
- <para>
- <code>Zend_Cache</code> предназначен для кэширования любых данных.
- </para>
- <para>
- Управление кэшированием в Zend Framework производится через фронтэнды
- (интерфейсные части), записи кэша сохраняются через бэкэнды
- (адаптеры <code>File</code>, <code>Sqlite</code>, <code>Memcache</code>
- и др.), с использованием гибкой системы идентификаторов и тегов,
- благодаря которым можно потом легко удалять определенные типы записей
- (например: "удалить все записи кэша, помеченные данным тегом").
- </para>
- <para>
- Ядро модуля (<code>Zend_Cache_Core</code>) является гибким,
- универсальным и конфигурируемым. Кроме этого, для особых нужд есть
- фронтэнды, расширяющие
- <code>Zend_Cache_Core</code>: <code>Output</code>, <code>File</code>,
- <code>Function</code> и <code>Class</code>.
- </para>
- <example id="zend.cache.introduction.example-1">
- <title>Получение фронтэнда с помощью <code>Zend_Cache::factory()</code></title>
- <para>
- <code>Zend_Cache::factory()</code> инстанцирует нужные объекты и
- связывает их. В этом первом примере мы будем использовать
- фронтэнд <code>Core</code> с бэкэндом <code>File</code>.
- </para>
- <programlisting role="php"><![CDATA[
- $frontendOptions = array(
- 'lifetime' => 7200, // время жизни кэша - 2 часа
- 'automatic_serialization' => true
- );
- $backendOptions = array(
- 'cache_dir' => './tmp/' // директория, в которой размещаются файлы кэша
- );
- // получение объекта Zend_Cache_Core
- $cache = Zend_Cache::factory('Core',
- 'File',
- $frontendOptions,
- $backendOptions);
- ]]>
- </programlisting>
- </example>
- <note>
- <title>Фронтэнды и бэкэнды, содержащие несколько слов в названии</title>
- <para>
- Некоторые фронтэнды и бэкэнды имеют имена, состоящие из нескольких
- слов, например, 'ZendPlatform'. Когда задаете их через фабрику,
- разделяйте слова с помощью разделителей, таких, как пробел (' '),
- тире ('-'), или точка ('.').
- </para>
- </note>
- <example id="zend.cache.introduction.example-2">
- <title>Кэширование результатов запроса к базе данных</title>
- <para>
- Теперь, имея фронтэнд, мы можем кэшировать любые типы данных,
- используя сериализацию. Например, мы можем кэшировать результат
- очень ресурсоемкого запроса к БД. После его добавления
- в кэш не нужно будет даже подключаться к базе данных: записи
- извлекаются из кэша и выполняется процедура, обратная сериализации.
- </para>
- <programlisting role="php"><![CDATA[
- // $cache определен в предыдущем примере
- // проверка, есть ли уже запись в кэше:
- if(!$result = $cache->load('myresult')) {
- // промах кэша
- // установка соединения с базой данных
- $db = Zend_Db::factory( [...] );
- $result = $db->fetchAll('SELECT * FROM huge_table');
- $cache->save($result, 'myresult');
- } else {
- // попадание в кэш
- echo "This one is from cache!\n\n";
- }
- print_r($result);
- ]]>
- </programlisting>
- </example>
- <example id="zend.cache.introduction.example-3">
- <title>Кэширование вывода с помощью фронтэнда <code>Zend_Cache</code></title>
- <para>
- Мы размечаем участки, выходные данные которых хотим поместить в кэш,
- добавлением условной логики, окружая участок методами
- <code>start()</code> и <code>end()</code>. Этот пример похож на
- первый и является основной стратегией кэширования.
- </para>
- <para>
- Внутри выводим данные как обычно — весь вывод будет добавлен в кэш,
- когда будет достигнут метод <code>end()</code>. При следующем
- запуске весь участок кода будет пропущен, вместо этого извлекаются
- данные из кэша (до тех пор, пока записи действительны).
- </para>
- <programlisting role="php"><![CDATA[
- $frontendOptions = array(
- 'lifetime' => 30, // время жизни кэша - 30 секунд
- 'automatic_serialization' => false // уже установлено по умолчанию
- );
- $backendOptions = array('cache_dir' => './tmp/');
- $cache = Zend_Cache::factory('Output',
- 'File',
- $frontendOptions,
- $backendOptions);
- // передаем уникальный идентификатор методу start()
- if(!$cache->start('mypage')) {
- // производим вывод, как обычно:
- echo 'Hello world! ';
- echo 'This is cached ('.time().') ';
- $cache->end(); // выходные данные сохранены и отправлены броузеру
- }
- echo 'This is never cached ('.time().').';
- ]]>
- </programlisting>
- <para>
- Обратите внимание, что мы выводим результат <code>time()</code>
- дважды - это демонстрация на примере динамических данных. Попробуйте
- запустить это и обновить страницу несколько раз, и вы заметите,
- что первое число не изменяется, в то время как второе меняется в
- зависимости от текущего времени. Это потому, что первое число
- было выведено в кэшируемой части и сохранено среди других выходных
- данных. После того, как пройдет полминуты (мы установили время жизни
- кэша равным 30 секундам) числа снова должны стать одинаковыми, так
- как срок действия кэша истек, сразу после этого производится новое
- сохранение в кэш.
- </para>
- </example>
- <note><para>
- Когда используете <code>Zend_Cache</code>, уделяйте внимание
- идентификатору кэша (передается методам <code>save()</code> и
- <code>start()</code>). Он должен быть уникальным для каждого кэшируемого
- ресурса, иначе не связанные записи кэша могут затирать друг
- друга, или, что еще хуже, отображаться вместо других.
- </para></note>
- </sect1>
- <!--
- vim:se ts=4 sw=4 et:
- -->
|