Как мне реализовать простую систему кэширования на стороне сервера?
Теперь, когда мы понимаем идеи буферизации вывода, пришло время рассмотреть,
как мы можем использовать этот процесс в действии таким образом, чтобы его было
легко поддерживать. Чтобы сделать это, мы воспользуемся небольшой помощью от
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
|
Если запросить этуже страницу позже, код, приведенный выше, покажет вам
содержимое этих файлов, конечно в том случае, если время их жизни еще не
истекло.
Защищайте файлы с кэшем.
Удостоверьтесь, что каталог, в котором вы храните файлы кэша, не является
публично доступным. иначе посетители вашего сайта смогут сделать большее, чем вы
хотели бы им позволить.