4.2. Теория кэширования

Есть три ключевых понятия в Zend_Cache. Первое — уникальный идентификатор (строка), который служит для идентификации записей кэша. Второе — это директива 'lifetime', которую вы могли видеть в предыдущих примерах; она определяет, в течение какого времени кэшируемый ресурс считается "свежим". Третье понятие — условное исполнение, используемое для того, чтобы части вашего кода могли быть пропущены целиком, этим повышается производительность. Основной метод фронтэнда (например, Zend_Cache_Core::get()) всегда спроектирован так, чтобы должен возвращать false при промахе кэша, если это имеет смысл для данного фронэнда. Это дает конечным пользователям возможность включать части кода, которые нужно кэшировать (и затем пропускать) в операторы if(){ ... }, где условием является сам метод Zend_Cache. Но в конце этих блоков вы должны сохранять то, что было сгенерировано (например, методом Zend_Cache_Core::save()).

[Замечание] Замечание

Для некоторых фронтэндов включение условного исполнения в код не нужно, так как вся логика уже реализована в них (например, Function).

[Замечание] Замечание

"Попадание в кэш" — термин для того состояния, когда запись кэша найдена, является корректной и "свежей" (в других словах, для которой не закончился срок действия). Иначе имеет место "промах кэша". Когда происходит "промах кэша", вы должны сгенерировать свои данные, которые помещаются в кэш. С другой стороны, если есть "попадание", то бэкэнд автоматически извлечет запись из кэша.

4.2.1. Фабричный метод Zend_Cache

Корректным способом создания рабочего экземпляра фронтэнда Zend_Cache является код показанный в следующем примере:

<?php
        
# Загружаем фабрику Zend_Cache 
require 'Zend/Cache.php'; 

# Выбираем бэкэнд (например, 'File' или 'Sqlite'...)
$backendName = '[...]';

# Выбираем фронтэнд (например, 'Core', 'Output', 'Page'...)
$frontendName = '[...]';

# Устанавливаем массив опций для выбранного фронтэнда
$frontendOptions = array([...]);

# Устанавливаем массив опций для выбранного бэкэнда
$backendOptions = array([...]);

# Создаем экземпляр 
# (два последних аргумента являются необязательными)
$cache = Zend_Cache::factory($frontendName, $backendName, $frontendOptions, $backendOptions);

?>   

В следующих примерах мы предполагаем, что переменная $cache содержит инстанцированный, как показано в примере, фронтэнд, и что вы понимаете, как передавать параметры выбранному вами бэкэнду.

[Замечание] Замечание

Всегда используйте Zend_Cache::factory() для получения экземпляров фронтэнда. Непосредственно созданные экземпляры фронтэндов и бэкэндов будут работать не так, как ожидается.

4.2.2. Добавление тегов к записям

Теги являются средством категоризации записей кэша. Когда вы производите сохранение в кэш методом save(), то можете установить массив тегов к данной записи. После этого вы можете удалить все записи кэша, помеченные данным тегом (тегами).

<?php
             
$cache->save($huge_data, 'myUniqueID', array('tagA', 'tagB', 'tagC'));
            
?>   
[Замечание] Замечание

Метод save() принимает также необязательный четвертый параметр: $specificLifetime. Если он не равен false, то устанавливается время жизни определенной записи кэша.

4.2.3. Очистка кэша

Для того, чтобы удалить или сделать недействительной запись с определенным идентификатором, вы можете использовать метод remove():

<?php 
             
$cache->remove('idToRemove');
            
?>   

Для того, чтобы за одну операцию удалить или сделать недействительными несколько записей кэша, вы можете использовать метод clean(). Например, чтобы удалить все записи кэша:

<?php 

// удаление всех записей
$cache->clean(Zend_Cache::CLEANING_MODE_ALL);

// удаление только устаревших записей
$cache->clean(Zend_Cache::CLEANING_MODE_OLD);
            
?>   

Если вы хотите удалить записи кэша, помеченные тегами 'tagA' и 'tagC':

<?php 
             
$cache->clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG, array('tagA', 'tagC'));
            
?>   

Доступные режимы очищения: CLEANING_MODE_ALL (удалить все), CLEANING_MODE_OLD (удалить устаревшие), CLEANING_MODE_MATCHING_TAG (удалить помеченные тегом) и CLEANING_MODE_NOT_MATCHING_TAG (удалить не помеченные тегом). Последние два, как ясно из названий, передаются вместе с массивом тегов.