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

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


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

В главе 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 секунд).

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