Русская документация для фриланесеров
Главная arrow PHP arrow Простое кеширование на стороне сервера  
08.01.2009 г.
Главное меню
Главная
Поиск
PHP
.NET
Java
Ruby
C++
Delphi
Другие языки
Базы данных
Безопасность
Сети
ОС
Мобильные
Теория дизайна
WEB
Разное
Админцентр



Доктор Айс ремонт холодильников, открывать ремонт с гарантией

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

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


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


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


Пример 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\′) . \′<br />\′;
$cache->end();
}

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


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


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


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


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


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


Настройки Cache_Lite


При вызове Cache_Lite (или любого из субклассов, например Cache_Lite_Output), есть много способов управлять его поведением. Все параметры должны быть помещены в массив и переданы конструктору:


Пример 5.10. 4.php (окончание)
<?php
// Задаем настройки для Cache_Lite
$options = array(
\′cacheDir\′ => \′./cache/\′,
\′writeControl\′ => TRUE,
\′readControl\′ => TRUE,
\′readControlType\′ => \′md5\′
);

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


В текущем версии класса (1.1) доступны следующие настройки:

cacheDir – Это каталог, в которрый будут помещаться файлы кэша. Значение по умолчанию – каталог, где выполняется скрипт.
caching – эта опция включает или выключает возможности Cache_Lite. Например, если у вас очень много запросов к Cache_Lite, а в процессе отладки вы захотите выключить кэширование, установить в FALSE. Значение по умолчанию – TRUE.
lifetime – Этот параметр содержит в себе заданный по умолчанию отрезок времени жизни кэша (в секундах). Изменить значение можно вызвав метод setLifeTime(). Значение по умолчанию 3600 (один час).
fileNameProtection – Если данная опция включена, Chache_Lite будет использовать MD5 кодирование для генерации имени файла с кэшем. Это позволяет вам использовать в названии файлов кэша и групп любые символы, даже запрещенные файловой системой. Этот параметр должен быть включен, когда вы используете Cache_Lite_Function. Значение по умолчанию – TRUE (включено).
fileLocking – Этот параметр включает механизмы блокирования файла с кэшем, на время записи в него данных. Значение по умолчанию – TRUE (включено).
writeControl – Проверяет, что файл кэша был записан правильно сразу после окончания записи. В случае ошибки бросает PEAR:Error. Эта возможность позволяет вашему скрипту перезаписать файл кэша еще раз, но замедляет его работу. Значение по умолчанию TRUE (включено).
readControl – Перед чтением файла с кэшем проверяет его на искажения. Cache_Lite размещает в файле значение длинны файла, которое можно использовать для контроля его целостности. Также имеется альтернативный механизм проверки целостности файла. Он включается параметром readControlType. Эти механизмы несколько замедляют скорость, но помогают гарантировать, что ваши пользователи увидят неиспорченную страницу. значение по умолчанию TRUE (включено).
readControlType – Этот параметр определяет тип механизма чтения файлов кэша. Доступные механизмы: цикличная проверка избыточности (\′crc32\′ – значение по умолчанию) – использует функцию crc32 PHP, \′MD5\′ хэш – используется функция md5 PHP, или простую проверку длинны – \′strlen\′. Обратите внимание, что этот механизм не предназначен для защиты файлов кэша от вызова их напрямую посторонними пользователями. Это всего лишь способ определить – испорчен файл или нет.
pearErrorMode – включает принятый в PEAR способ возврата ошибок. Значение по умолчанию CACHE_LITE_PEAR_RETURN – возвращает объект /#c#?PEAR::Error.
memoryCaching – Если данный параметр включен, каждый раз, как вы вызываете запись кэша в файл, он записывается в массив Cache_Lite. saveMemoryCachingState и getMemoryCachingState используются для доступа к кэшу, сохраненному в памяти между запросами. Преимущество подобного метода состоит в том, что содержимое кэша может быть сохранено в едином файле, сокращая число циклов чтения/записи на диск. Кэш восстанавливается прямо в массив, к которому ваш скрипт имеет доступ. В наших примерах мы будем использовать обычный механизм Cache_Lite, но вам стоит поэкспериментировать с этим параметром в дальнейшем, если у вас очень большой сайт. По умолчанию TRUE (выключено).
onlyMemoryCaching – Если вы включили этот параметр – будет использоваться только механизм кэширования в памяти. По умолчанию TRUE (выключено).
memoryCachingLimit – Этот парметр определяет предел количества файлов кэша, которые могут быть сохранены в массиве в памяти. чем больше число файлов – тем больше памяти будет расходоваться. Поэтому определить ограничение – это очень хорошая идея. Конечно это не влияет на размер файла кэша, поскольку один или два массивных файла не создадут никаких проблем. значение по умолчанию – 1000.


Очистка кэша


Cahce_Lite содержит в себе удачный механизм определения времени жизни файлов кэша, что создает хорошую основу для сохранности ваших файлов и их своевременного обновления. Однако, бывают моменты, когда вам требуется немедленное обновление файла кэша. Для таких случаев существует методы remove() и clean(). Метод remove() предназначен для удаления конкретного файла кэша. ему требуется ID кэша и название группы, в которую входит файл. Следующий пример удалит файл с кэшем тела (body) из предыдущего примера:


$cache->remove(\′body\′, \′Dynamic\′);


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


$cache->clean(\′Static\′);


Методы remove() и clean() нужно, очевидно, вызывать в ответ на события, в пределах приложения. Например, у вас есть форум, наверняка следует удалить файл кэша, если какой-либо пользователь отправит новое сообщение. Несмотря на то, что это решение выглядит красиво, оно может повлечь за собой изменение кода. Если у вас есть главный скрипт, который подключается к каждой странице приложения, которую может просмотреть посетитель, вы можете просто наблюдать за поступающими событиями, например, за переменной $_GET[\′newPost\′], удаляя требуемые файлы кэша. Это позволит вам создать ентрализованный механизм управления кэшем. вы могли бы даже включить этот код в php.ini (см. описание настройки auto_prepend_file).


Кэширование вызовов функций


В главе 2, XML, мы рассмотрели удалённый доступ к web-сервисам при помощи SOAP и XML-RPC. Поскольку web-сервисы доступны по сети, часто является хорошей идеей кэшировать результат так, чтобы он мог выполняться локально, а не повторять выполнение одного и того же медленного запроса многократно. В простейшем случае мы могли бы воспользоваться сессиями PHP, которые мы рассмотрели в той главе, но поскольку это решение действует на основе регулярности посетителя, открытие запроса для каждого посетителя будет всё ещё медленным. В таких случаях может быть очень удобен Cache_Lite.


PEAR использует Cache_Lite


PEAR Web installer (читайте Appendix D, работа с PEAR) использует в своей работе Cache_Lite для кэширования XML-RPC запросов, передаваемых PEAR Web серверу.


В разделе, называемом “How do I consume SOAP Web services with PHP?”, мы писали клиента для обслуживания SOAP Web service основанного на его WSDL файле; этот сервис обслуживает информацией о погоде все аэропорты в мире. Вот код, который получает данные от удаленного сервера:


$countries = $stationInfo->listCountries();


и


$country = $stationInfo->searchByCountry($_GET[\′country\′]);


В обоих случаях, эти вызовы соответствуют запросу данных по сети. Используя Cache_Lite, мы могли бы кэшировать данные, возвращаемые сервисом, и могли бы использовать их многократно. Это позволило бы избежать дополнительных ненужных сетевых соединений, и значительно увеличило бы скорость выполнения. Обратите внимание, что сдесь мы рассматриваем только код, касающийся нашей темы. В начале мы подключаем Cache_Lite_Function:


Пример 5.11. 5.php (начало)
// Include PEAR::Cache_Lite_Function
require_once \′Cache/Lite/Function.php\′;


Далее мы инициализируем сласс Cache_Lite_Function с определенными параметрами:


Пример 5.12. 5.php (продолжение)
// Задаем параметры для for Cache_Lite_Function
// ВНИМАНИЕ: fileNameProtection = TRUE!
$options = array(
\′cacheDir\′ => \′./cache/\′,
\′fileNameProtection\′ => TRUE,
\′writeControl\′ => TRUE,
\′readControl\′ => TRUE,
\′readControlType\′ => \′strlen\′,
\′defaultGroup\′ => \′SOAP\′
);

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


Важно, что параметр fileNameProtection установлен в TRUE. Это хначение принято по умолчанию, однако я специально выставил его вручную, чтобы подчеркнуть значимость. Если этот параметр установить в FALSE, получится недопустимое имя файла, так что кэширования не будет.


Далее, мы делаем запрос к нашему клиенту SOAP:


Пример 5.13. 5.php (продолжение)
$countries = $cache->call(\′stationInfo->listCountries\′);


И:


Пример 5.14. 5.php (окончание)
$country = $cache->call(\′stationInfo->searchByCountry\′,
$_GET[\′country\′]);


Если запрос делается впервые, Cache_Lite_Function хранит результаты в виде сериализованного массива в файле кэша (вы не должны об этом волноваться), и этот файл будет использоваться для будущих запросов, пока не истечет время его жизни. setLifeTime может использоваться, чтобы определить как долго будет жить файл кэша, перед обновлением информации в нем. Занчение по умолчанию – 1 час (3600 секунд).


Вообще, Cache_Lite обеспечивает единую, простую в использовании систему, чтобы решить любые вопросы, связанные с кэшированием. Поскольку следующий уровень – это сайты с особенно большим трафиком, вам стоит исследовать PEAR::Cache, это большой брат Cache_Lite. Он также предусматривает расширение возможностей кэширования, например, кэширование в общей памяти, как альтернативу кэширование в файл, или помощь Msession PHP extension, храня данные в сбалансированной сессии, которая является особенно полезной в сбалансированных WEB серверах. Дргие материалы о PEAR::Cache я приведу в конце этой статьи. Cache_Lite, однако, предлагает более чем достаточные возможности, и отвечает потребностям большинства сайтов.

Источник - http://www.excode.ru/art8063p1.html 

 
« Пред.   След. »
Webdesign by Webmedie.dk Webdesign by Webmedie.dk