Фронтэнд Zend_Cache_Core
является особым,
так как это ядро всего модуля. Это фронтэнд общего назначения и
он расширяется другими классами.
Замечание | |
---|---|
Все фронтэнды наследуют от класса
|
Эти опции передаются фабричному методу, как было показано в предыдущих примерах.
Таблица 4.1. Доступные опции
Опция | Тип данных | Значение по умолчанию | Описание |
---|---|---|---|
caching |
boolean |
true |
Включает / отключает кэширование (может быть очень полезным при отладке кэшируемых скриптов). |
lifetime |
int |
3600 |
Время жизни кэша (в секундах), если установлен в
null , то кэш имеет бесконечное время жизни.
|
logging |
boolean |
false |
Если установлен в true , то включается логирование через
Zend_Log (но система будет работать медленнее).
|
write_сontrol |
boolean |
true |
Включает / отключает контроль записи (кэш читается сразу после записи для выявления поврежденных записей), включение writeControl немного замедлит запись кэша, но не чтение. Этот контроль может выявить некоторые поврежденные файлы кэша, но не является совершенным. |
automatic_serialization |
boolean |
false |
Включает / отключает автоматическую сериализацию, она может использоваться для сохранения напрямую данных, которые не являются строками (но это будет меденнее). |
automatic_cleaning_factor |
int |
10 |
Отключает / настраивает автоматический процесс
очистки (сборщик мусора) :
0 означает, что автоматическая
чистка кэша не производится,
1 означает систематическую очистку
кэша,
x (integer) > 1 означает, что
автоматическая чистка производится случайным
образом 1 раз на x записей кэша.
|
Пример был дан в самом начале данного раздела руководства.
Если вы храните в кэше только строки (с опцией
automatic_serialization
возможно хранить некоторые
булевы значения), вы можете использовать более компактную
конструкцию, похожую на:
<?php // предполагается, что переменная $cache уже установлена $id = 'myBigLoop'; // идентификатор того, что мы хотим закэшировать if (!($data = $cache->load($id))) { // промах кэша $data = ''; for ($i = 0; $i < 10000; $i++) { $data = $data . $i; } $cache->save($data); } // [...] делаем что-либо с данными (отображение, передача и т.д.) ?>
Если вы хотите закэшировать несколько блоков или экземпляров данных, то принцип будет тот же:
<?php // убедитесь, что используете уникальные идентификаторы: $id1 = 'foo'; $id2 = 'bar'; // блок 1 if (!($data = $cache->load($id1))) { // промах кэша $data = ''; for ($i=0;$i<10000;$i++) { $data = $data . $i; } $cache->save($data); } echo($data); // эта часть не кэшируется echo('НЕ КЭШИРУЕТСЯ! '); // блок 2 if (!($data = $cache->load($id2))) { // промах кэша $data = ''; for ($i=0;$i<10000;$i++) { $data = $data . '!'; } $cache->save($data); } echo($data); ?>
Zend_Cache_Frontend_Output
является фронтэндом,
собирающим выходные данные. Он использует буферизацию вывода
(output buffering) в PHP для сохранения всего, что выводится
между его методами start()
и end()
.
Этот фронтэнд не имеет специальных опций, отличных
от опций Zend_Cache_Core
.
Пример был дан в самом начале данного раздела руководства. Здесь он с небольшими изменениями:
<?php // если имеет место промах кэша, // то начинается буферизация вывода if (!($cache->start('mypage'))) { // все выводится, как обычно echo 'Hello world! '; echo 'This is cached ('.time().') '; $cache->end(); // завершение буферизации вывода } echo 'This is never cached ('.time().').'; ?>
Используя эту форму, довольно легко установить кэширование вывода в уже работающем проекте с незначительным рефакторингом кода или совсем без него.
Zend_Cache_Frontend_Function
сохраняет в кэш
результаты вызова функции. Он имеет единственный основной метод
call()
который принимает имя функции и параметры
вызова в массиве.
Таблица 4.2. Доступные опции
Опция | Тип данных | Значение по умолчанию | Описание |
---|---|---|---|
cacheByDefault |
boolean |
true |
Если равен true, то вызовы функции по умолчанию кэшируются. |
cachedFunctions |
array |
Имена функций, которые всегда кэшируются. | |
nonCachedFunctions |
array |
Имена функций, которые никогда не должны кэшироваться. |
Функция call()
используется так же, как и
call_user_func_array()
в PHP:
<?php $cache->call('veryExpensiveFunc', $params); # $params является массивом # например, если нужно вызвать (с кэшированием) veryExpensiveFunc(1, 'foo', 'bar'), # то вы должны использовать $cache->call('veryExpensiveFunc', array(1, 'foo', 'bar')) ?>
Zend_Cache_Frontend_Function
достаточно
интеллектуален, чтобы кэшировать как возвращаемое функцией
значение, так и данные, выводимые внутри нее.
Замечание | |
---|---|
Вы можете передавать любые встроенные, так и определенные
пользователем функции, за исключением |
Zend_Cache_Frontend_Class
отличается от
Zend_Cache_Frontend_Function
тем, что позволяет
кэшировать объекты и статические вызовы методов.
Таблица 4.3. Доступные опции
Опция | Тип данных | Значение по умолчанию | Описание |
---|---|---|---|
cachedEntity (required) |
mixed |
Если установлен как имя класса, то будет кэшироваться абстрактный класс и будут использоваться только статические вызовы; если установлен как объект, то будут кэшироваться методы объекта. | |
cacheByDefault |
boolean |
true |
Если установлен в true , то вызовы
будут кэшироваться по умолчанию.
|
cachedMethods |
array |
Имена методов, которые должны всегда кэшироваться. | |
nonCachedMethods |
array |
Имена методов, которые никогда не должны кэшироваться. |
Кэширование статических вызовов:
<?php class test { # статический метод public static function foobar($param1, $param2) { echo "foobar_output($param1, $param2)"; return "foobar_return($param1, $param2)"; } } // [...] $frontendOptions = array( 'cachedEntity' => 'test' // имя класса ); // [...] # кэшируемый вызов $res = $cache->foobar('1', '2'); ?>
Кэширование обычных вызовов методов:
<?php class test { private $_string = 'hello !'; public function foobar2($param1, $param2) { echo($this->_string); echo "foobar2_output($param1, $param2)"; return "foobar2_return($param1, $param2)"; } } // [...] $frontendOptions = array( 'cachedEntity' => new test() // экземпляр класса ); // [...] # кэшируемый вызов $res = $cache->foobar2('1', '2'); ?>
Zend_Cache_Frontend_File
является фронтэндом,
который управляется временем изменения "главного файла".
Он очень полезен для конфигурации или шаблонов.
Например, у вас есть конфигурационный файл XML, он парсится
функцией, которая возвращает объект конфигурации
(наподобие Zend_Config
). С помощью
Zend_Cache_Frontend_File
вы можете сохранять объект
конфигурации в кэш (чтобы избежать повторного парсинга
конфигурационного файла XML), но с сильной зависимостью
от "главного файла". Если конфигурационный файл XML изменяется,
то кэш сразу становится недействительным.
Zend_Cache_Frontend_Page
похожа на Zend_Cache_Frontend_Output
,
но предназначена для кэширования целых страниц. Zend_Cache_Frontend_Page
нельзя использовать для кэширования отдельных блоков.
Идентификатор кэша вычисляется автоматически
с использованием $_SERVER['REQUEST_URI']
и
(в зависимости от опций) $_GET
, $_POST
,
$_SESSION
, $_COOKIE
, $_FILES
.
Кроме этого, вы используете только один метод для вызова
(start()
), потому что end()
вызывается
автоматически, когда страница заканчивается.
На данный момент мы планируем добавить условную систему HTTP для сохранения пропускной способности (система будет отправлять HTTP 304 Not Modified, если есть попадание в кэш и броузер уже имеет правильную версию страницы).
Замечание | |
---|---|
Zend_Cache_Frontend_Page сейчас находится на стадии "альфа", это означает, что она и в дальнейшем будет совершенствоваться. |
Таблица 4.5. Доступные опции
Опция | Тип данных | Значение по умолчанию | Описание |
---|---|---|---|
http_conditional |
boolean |
false |
Использовать условную систему HTTP (не реализовано на данный момент) |
debug_header |
boolean |
false |
Если установлен в true , то
отладочный текст включается перед каждой
кэшируемой страницей.
|
default_options |
array |
array(...смотрите далее...) |
Ассоциативный массив опций, включаемых по
умолчанию
|
regexps |
array |
array() |
Ассоциативный массив для установки опций только для некоторых REQUEST_URI. Ключами этого массива являются регулярные выражения (PCRE), значениями — ассоциативные массивы со специальными опциями, которые устанавливаются, если $_SERVER['REQUEST_URI'] соответствует регулярному выражению (см. default_options в этом списке доступных опций). Если $_SERVER['REQUEST_URI'] соответствует нескольким регулярным выражениям, то используется только последнее из них. |
Использование Zend_Cache_Frontend_Page
довольно
простое:
<?php // [...] $cache->start(); // если есть попадание в кэш, то результат отправляется броузеру // и выполнение скрипта на этом прекращается // rest of the page ... ?>
Более сложный пример, который показывает способ создания
централизованного управления кэшированием в загрузочном файле
(для использования с Zend_Controller
, например).
<?php // [...] вы должны избегать слишком большого количества строк кода перед участком кэша // [...] например, для наибольшей производительности "require_once" или "Zend_Loader::loadClass" // [...] должны находиться после участка кэша require_once 'Zend/Cache.php'; $frontendOptions = array( 'lifetime' => 7200, 'debug_header' => true, // для отладки 'regexps' => array( '^/$' => array('cache' => true), // кэширование всего IndexController; '^/index/' => array('cache' => true), // кэширование всего IndexController; '^/article/' => array('cache' => false), // не кэшируем ArticleController... '^/article/view/' => array( // ...но кэшируем действие "view" 'cache' => true, // контроллера ArticleController; 'cache_with_post_variables' => true, // кэшируем, даже если есть переменные $_POST 'make_id_with_post_variables' => true, // (но кэш будет зависеть от массива $_POST) ) ) ); $backendOptions = array( 'cache_dir' => '/tmp/' ); // получение объекта Zend_Cache_Frontend_Page $cache = Zend_Cache::factory('Page', 'File', $frontendOptions, $backendOptions); $cache->start(); // если есть попадание в кэш, результат отправляется броузеру, // и выполнение скрипта на этом завершается // [...] конец загрузочного файла (этот код не исполняется, если есть попадание в кэш) ?>