Кэширование в PHP

Автор статьи: Harry Fuecks (Перевод: Муллин Сергей (SiMM), Кузьма Феськов)
Сайт Автора: php.russofile.ru
E-mail Автора: kuzma@russofile.ru
Дата публикации: 25.04.2006


Как мне реализовать простую систему кэширования на стороне сервера?

Теперь, когда мы понимаем идеи буферизации вывода, пришло время рассмотреть, как мы можем использовать этот процесс в действии таким образом, чтобы его было легко поддерживать. Чтобы сделать это, мы воспользуемся небольшой помощью от PEAR::CacheLite (версия 1.1 использовалась в приведённых здесь примерах).

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

Cache_Lite состоит из трех основных классов. Первым является базовый класс Cache_Lite, который отвечает только за создание и чтение кеш-файлов и не занимается буферизацией вывода. Данный класс можно использовать в одиночку в тех случаях, когда нет необходиомсти использовать буферизацию вывода, как например при сохранении результата разбора шаблона PHP скриптом. Приведенные здесь примеры не используют класс Cache_Lite напрямую и демонстрируют применение остальных двух классов. Cache_Lite_Function используется для вызова функции или метода класса и последующего кеширования результатов работы. Это может оказаться полезным, например для кеширования результата запроса к MySQL. Класс Cache_Lite_Output использует PHP функции контроля за выводом для перехвата данных, сгенерированных скриптом, и сохранения их в кеш-файлах. Это позволяет выполнять те же задачи, что и предыдущее решение.

Вот пример, который покажет вам, как вы могли бы использовать Cache_Lite, чтобы выполнить задачу, которую мы рассмотрели в предыдущей части. Чтобы рассмотреть любое применение Cache_Lite, мы должны его сначала настроить - создать массив параметров - который определит поведение класса. Ниже мы рассмотрим их подробнее, а пока обратите внимание на то, что ваш скрипт должен иметь права на чтение и запись в каталог cahceDir.

**Пример 5.7. ##4.php## (начало)**

<?php 
// Подключаем класс вывода PEAR::Cache_Lite
require_once 'Cache/Lite/Output.php'; 

// Определяем настройки для Cache_Lite 
$options = array( 
 'cacheDir'        => './cache/', 
 'writeControl'    => 'true', 
 'readControl'     => 'true', 
 'readControlType' => 'md5' 
); 

// Создаем объект класса Cache_Lite_Output 
$cache = new Cache_Lite_Output($options);
?>

Для каждой части вывода вашего скрипта, которую вы хотите кэшировать, необходимо установить время жизни кэша в секундах. это время определяет, как долго нужно брать данные из кэше. По истечении этого времени, данные в файле будут обновлены. Далее, мы вызываем метод start(), доступный только в классе Cahce_Lite_Output, который включает буферизацию вывода. В метод мы передаем 2 параметра: первый - идентификатор файла с кэшем, второй - группа (тип кэша). Параметр "группа" позволяет объединять несколько шаблонов, это позволяет производить групповые действия, например, удалить все файлы кэша в группе. Как только вывод нужной нам части закончен, мы должны вызвать метод stop(). Этот метод остановит буферизацию и сохранит содержимое буфера в файл.

**Пример 5.8. ##4.php## (продолжение)**

<?php
// Устанавливаем время жизни кэша для данной части 
$cache->setLifeTime(604800); 

// Начинаем буферизацию для участка с именем header
// и помещаем его в группу Static
if (!$cache->start('header', 'Static')) { 
 ?> 
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
 <html xmlns="http://www.w3.org/1999/xhtml"> 
 <head> 
 <title> PEAR::Cache_Lite пример</title> 
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" /> 
 </head> 
 <body> 
 <h2>PEAR::Cache_Lite пример</h2> 
 Время создания заголовка: <?php echo date('H:i:s'); ?><br /> 
 <?php 
 // Останавливаем буферизацию и пишем буфер в файл
 $cache->end(); 
}
?>

Кэширование основного тела вывода (body) и нижней части (footer) происходит аналогично кэшированию заголовка. Обратите внимание, мы снова выставляем время жизни кэша, для каждой следующей части.

**Пример 5.9. ##4.php## (продолжение)**

<?php
$cache->setLifeTime(5); 
if (!$cache->start('body', 'Dynamic')) { 
 echo 'Время создания тела: ' . date('H:i:s') . '
'; $cache->end(); } $cache->setLifeTime(604800); if (!$cache->start('footer', 'Static')) { ?> Время создания нижней части: <?php echo date('H:i:s'); ?>
<?php $cache->end(); } ?>

Когда вы вызовете для просмотра эту страницу, Cache_Lite создаст в каталоге для кэширования следующие файлы:

./cache/cache_Static_header 
./cache/cache_Dynamic_body 
./cache/cache_Static_footer

Если запросить этуже страницу позже, код, приведенный выше, покажет вам содержимое этих файлов, конечно в том случае, если время их жизни еще не истекло.

Защищайте файлы с кэшем.

Удостоверьтесь, что каталог, в котором вы храните файлы кэша, не является публично доступным. иначе посетители вашего сайта смогут сделать большее, чем вы хотели бы им позволить.