Использование PEAR для буферизации программ PHP
Буферизация — горячая тема в мире PHP, поскольку динамические страницы, генерируемые PHP, необходимо пересчитывать каждый раз, когда пользователь их запрашивает, независимо от того, является ли результат запроса одинаковым. При этом PHP каждый раз компилирует скрипт. Такая перегрузка наверняка будет невыносимой для сайта с высокой посещаемостью. К счастью, результаты работы в Интернете можно кэшировать без необходимости повторного запуска и компиляции сценария. Коммерческие продукты, такие как ZendCache или альтернативный PHP-кэш с открытым исходным кодом, предоставляют возможность компилировать PHP-скрипты в байт-код и кэшировать их.
Пакет буферизации PEAR предоставляет основу для буферизации динамического контента, запросов к базе данных и вызовов функций PHP.
Точно так же, как в Perl есть CPAN, а в TeX — CTAN, в PHP также есть собственная центральная библиотека ресурсов для хранения классов, библиотек и модулей. Эта библиотека называется PEAR (репозиторий расширений и надстроек PHP).
В этой статье предполагается, что вы установили среду PEAR. Если нет, вы можете загрузить ее с веб-сайта PHP. Пакет буферов PEAR содержит общий класс буферов и несколько специализированных подклассов. Буферные классы используют классы-контейнеры для хранения буферизованных данных и управления ими.
Ниже приведены контейнеры, содержащиеся в буфере PEAR, и их соответствующие параметры:
файл — файловый контейнер хранит буферизованные данные в файловой системе и является самым быстрым контейнером.
cache_dir — это каталог, в котором контейнер хранит файлы.
filename_prefix — Префикс кэшированных файлов, например: «cache_».
shm — Контейнер shm помещает буферизованные данные в общую память. Тесты показывают, что в текущей реализации этот контейнер работает медленнее, чем файловый контейнер.
shm_key — Ключ, используемый общей памятью.
shm_perm — Разрешение на использование сегментов данных общей памяти.
shm_size — размер выделенной общей памяти.
sem_key — Ключевое значение семафора.
sem_perm — Разрешения для семафора.
db — уровень абстракции базы данных PEAR.
dsn — DSN подключения к базе данных. Вы можете обратиться к документации PEAR DB.
кэш_таблица — Имя таблицы.
phplib — Контейнер phplib использует уровень абстракции базы данных для хранения буферов.
db_class
файл_базы данных
путь_базы данных
локальный_файл
локальный_путь
ext/dbx — расширение уровня абстракции базы данных PHP. Если вы хотите хранить буферы в базе данных, вы можете использовать этот контейнер.
модуль
хозяин
БД
имя пользователя
пароль
кэш_таблица
настойчивый
Повышение производительности, получаемое при использовании PEAR Cache, зависит от выбранного вами буферного контейнера. Например, бессмысленно снова сохранять результаты базы данных в кеше базы данных.
Модуль буфера функций PEAR Cache может буферизовать результаты любой функции или метода, будь то встроенная функция PHP или пользовательская функция. По умолчанию он использует файловый контейнер и помещает буферизованные данные в каталог с именем function_cache.
Конструктор класса Cache_Function может иметь три необязательных параметра:
$container: имя контейнера-буфера.
$container_options: параметры массива буферного контейнера.
$expires: время (в секундах) истечения срока действия объекта буфера.
Когда обычный вызов функции использует метод call() класса Cache_Function, может быть активирована буферизация. Вызов call() прост, один аргумент — это имя функции, затем аргументы функции, второй аргумент — первая из вызываемых функций и так далее, давайте посмотрим на пример:
Пример 1. Вызов буферных функций и методов
//Вызов буфера функции PEAR Cache.
require_once 'Кэш/Function.php';
// Определим некоторые классы и функции.
класс фу {
функциональная панель ($ тест) {
echo "foo::bar($test)
";
}
}
класс бар {
функция foobar($object) {
echo '$'.$object.'->foobar('.$object.')
';
}
}
$bar = новый бар;
функция foobar() {
эхо 'foobar()';
}
// Получаем объект Cache_Function
$cache = новая Cache_Function();
// Буферизация статической функции bar() класса foo (foo::bar()).
$cache->call('foo::bar', 'test');
// $bar->foobar()
$cache->call('bar->foobar', 'bar');
$cache->call('foobar');
?>
Ниже мы используем Cache_Output для буферизации вывода:
Пример 2. Буферизация вывода сценария.
//Загружаем выходной буфер PEAR Cache
require_once 'Кэш/Выход.php';
$cache = new Cache_Output('file', array('cache_dir' => '.'));
// Вычисляем отметку буферизуемой страницы, мы предполагаем, что буферизация страницы зависит от
// URL, переменные HTTP GET и POST и файлы cookie.
$cache_id = $cache->generateID(
массив('url' => $REQUEST_URI, '
post' => $HTTP_POST_VARS, 'cookies' => $HTTP_COOKIE_VARS) );
// Буфер запроса
if ($content = $cache->start($cache_id)) {
// попадание в буфер
эхо $содержание;
умереть();
}
//буфер потерян
// -- Вставьте сюда содержимое для генерации кода --
// Сохраняем страницу в буфере
эхо $cache->end();
?>
Используя класс Cache_Output, можно легко преобразовать динамическое веб-приложение, управляемое базой данных, в статическое, тем самым значительно повышая производительность сайта. Все больше и больше сайтов используют GZIP для сжатия HTML-контента, что снижает потребление полосы пропускания сервера, а также может принести большую пользу пользователям, использующим модем для доступа в Интернет.
Cache_OutputCompression расширяет функциональность класса Cache_Output. Он буферизует содержимое HTML, сжатое GZIP, тем самым экономя время сжатия ЦП.