Кэширование вызовов функций
В главе 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, однако, предлагает более чем достаточные возможности, и
отвечает потребностям большинства сайтов.