| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- Reviewed: no -->
- <sect1 id="zend.cache.introduction">
- <title>Введение</title>
- <para>
- <classname>Zend_Cache</classname> предназначен для кэширования любых данных.
- </para>
- <para>
- Управление кэшированием в Zend Framework производится через фронтэнды
- (интерфейсные части), записи кэша сохраняются через бэкэнды
- (адаптеры <emphasis>File</emphasis>, <emphasis>Sqlite</emphasis>,
- <emphasis>Memcache</emphasis> и др.), с использованием гибкой системы
- идентификаторов и тегов, благодаря которым можно потом легко удалять
- определенные типы записей
- (например: "удалить все записи кэша, помеченные данным тегом").
- </para>
- <para>
- Ядро модуля (<classname>Zend_Cache_Core</classname>) является гибким,
- универсальным и конфигурируемым. Кроме этого, для особых нужд есть
- фронтэнды, расширяющие
- <classname>Zend_Cache_Core</classname>: <emphasis>Output</emphasis>,
- <emphasis>File</emphasis>, <emphasis>Function</emphasis> и <emphasis>Class</emphasis>.
- </para>
- <example id="zend.cache.introduction.example-1">
- <title>Получение фронтэнда с помощью Zend_Cache::factory()</title>
- <para>
- <methodname>Zend_Cache::factory()</methodname> инстанцирует нужные объекты и
- связывает их. В этом первом примере мы будем использовать
- фронтэнд <emphasis>Core</emphasis> с бэкэндом <emphasis>File</emphasis>.
- </para>
- <programlisting language="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 language="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>Кэширование вывода с помощью фронтэнда Zend_Cache</title>
- <para>
- Мы размечаем участки, выходные данные которых хотим поместить в кэш,
- добавлением условной логики, окружая участок методами
- <methodname>start()</methodname> и <methodname>end()</methodname>. Этот пример похож на
- первый и является основной стратегией кэширования.
- </para>
- <para>
- Внутри выводим данные как обычно — весь вывод будет добавлен в кэш,
- когда будет достигнут метод <methodname>end()</methodname>. При следующем
- запуске весь участок кода будет пропущен, вместо этого извлекаются
- данные из кэша (до тех пор, пока записи действительны).
- </para>
- <programlisting language="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>
- Обратите внимание, что мы выводим результат <methodname>time()</methodname>
- дважды - это демонстрация на примере динамических данных. Попробуйте
- запустить это и обновить страницу несколько раз, и вы заметите,
- что первое число не изменяется, в то время как второе меняется в
- зависимости от текущего времени. Это потому, что первое число
- было выведено в кэшируемой части и сохранено среди других выходных
- данных. После того, как пройдет полминуты (мы установили время жизни
- кэша равным 30 секундам) числа снова должны стать одинаковыми, так
- как срок действия кэша истек, сразу после этого производится новое
- сохранение в кэш.
- </para>
- </example>
- <note><para>
- Когда используете <classname>Zend_Cache</classname>, уделяйте внимание
- идентификатору кэша (передается методам <methodname>save()</methodname> и
- <methodname>start()</methodname>). Он должен быть уникальным для каждого кэшируемого
- ресурса, иначе не связанные записи кэша могут затирать друг
- друга, или, что еще хуже, отображаться вместо других.
- </para></note>
- </sect1>
- <!--
- vim:se ts=4 sw=4 et:
- -->
|