• Руслан
  • 24 Май 2009
  • Рубрика: PHP

Использование user-cache в APC

Я уже рассказывал о расширении APC для кеширования опкодов в одном из предыдущих постов, но рассказ об APC был бы неполным без упоминания об одной возможности, которую предоставляет это расширение, а именно о пользовательском кеше данных в оперативной памяти. Если просто само по себе кеширование опкодов, по результатам замеров производительности для Joomla1.5, дало увеличение скорости на ~40%, то дополнительное включение кеширования в настройках Джумлы позволило удвоить предыдущий результат!

Кеширование в APC

Если ваш сайт сделан на CMS Joomla1.5, то поддержка кеширования при помощи APC уже доступна для вашего сайта. Достаточно просто включить кеширование в “Общих настройках” сайта и выбрать из выпадающего списка способ кеширования: APC. Кстати, APC в этом списке может и отсутствовать - если он не установлен на веб-сервере. О том как устанавливается APC написано здесь.

Если же вы увеличиваете скорость работы своего скрипта или ваш сайт сделан на CMS, которая не поддерживает APC, я советую серьезно задуматься о том чтобы добавить кеширование в скрипт при помощи APC. Во-первых потому что APC по праву считается одним из наиболее быстрых из доступных в настоящее время механизмов кеширования, во-вторых добавить кеширование в большинстве случаев будет не так уж и сложно, а выигрыш в увеличении скорости генерации странички (в разы!) точно стоит потраченного времени. О том как работает пользовательское кеширование и пойдет речь в этой статье.

В первую очередь вам понадобится веб-сервер с mod_php и установленным расширением APC. Так как установка и настройка этого расширения уже рассматривалась в статье Установка APC я перейду сразу к теме пользовательского кеширования.

Что стоит сохранять в кеше

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

Если это позволяет наличие свободной памяти в кеше (как это определить я расскажу дальше) возможно стоит кешировать не только отдельные части данных, но можно сохранять в кеше сгенерированную скриптом html-страницу целиком. Такой подход является затратным с точки зрения расхода памяти, но он также позволяет добиться наибольшей скорости работы. Если свободного места в кеше не хватает для хранения всех страниц в памяти (а так оно скорее всего и будет :) ) можно придумать схему при которой полностью будут сохраняться в кеше только самые популярные страницы, а для остальных будут кешироваться только например сериализованные массивы с результатами запроса к БД.

Функции управления кешем APC

Сохранение данных в кеш похоже на работу с ассоциативными массивами (хешами). Вы выбираете уникальную строку, которая будет служить ключем (например вида название_сайта:url_страницы), и сохраняете эти данные в кеше с этим ключем. При дальнейших обращениях к странице вы сможете извлечь по этому ключу сохраненные данные. Для работы с кешем вам будет достаточно всего четырех функций:

  • bool apc_add ( string $key , mixed $var [, int $ttl= 0 ] )
    Сохранить данные только в том случае если такой ключ в кеше отсутствует.
  • mixed apc_fetch ( string $key [, bool &$success ] )
    Вернуть сохраненные данные по этому ключу.
  • bool apc_store ( string $key , mixed $var [, int $ttl= 0 ] )
    Сохранить данные по этому ключу (предыдущее значение, если было, стирается).
  • bool apc_delete ( string $key )
    Удалить сохраненные данные по этому ключу из кеша.

Статистика работы кеша

Для того чтобы эффективно настроить работу скрипта с кешем понадобится способ получения статистики о работе кеша. Советую взять файл apc.php из пакета установки расширения и скопировать его в директорию с сайтом. Теперь зайдя по адресу http://ваш_сайт/apc.php вы увидите на одной странице всю основную статистику по работе APC, которая вам понадобится в ближайшее время.

Особое внимание обратите на эти две таблицы:

  • User Cache Information
    User Cache Information
  • File Cache Information
    File Cache Information

Статистику по работе APC кеша можно получать также и “на ходу” из PHP-скрипта при помощи функции apc_cache_info() примерно так:

    print_r(apc_cache_info());

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

  • Cached Variables - общий объем сохраненных данных в кеше (Кб)
  • Hits - количество успешных обращений в кеш
  • Misses - количество “промахов” (если данные не были найдены в кеше)
  • Request Rate (hits, misses) - плотность запросов к кешу всего (количество в секунду)
  • Hit Rate - плотность успешных запросов к кешу (количество в секунду)
  • Miss Rate - плотность “промахов” (количество в секунду)
  • Insert Rate - плотность запросов на сохранение данных в кеше (количество в секунду)

Вторая таблица содержит аналогичные поля, но для файлов в кеше.

Очевидно, что чем большим будет показатель отношения Hits/Misses тем более эффективно работает кеширование. Также важно учитывать насколько процентов заполнено отведенное для кеша пространство в оперативной памяти (параметр apc.shm_size в файле конфигурации).

Пример скрипта по работе с apc-кешем

//создаем уникальный ключ по схеме sitename:url
$apckey = _SERVER["HTTP_HOST"] . ':' . $_SERVER['REQUEST_URI'];
 
//пытаемся прочитать готовую страницу из кеша
//если она была сохранена во время предыдущих обращений
//к странице
$htmlpage = apc_fetch($apckey);
 
//если она там есть
if ($htmlpage) {
	//выводим ее в браузер
	echo $htmlpage;
	exit;
}
//если нет
else {
	//включаем буферизацию всего вывода
	ob_start();
 
	//дальше идет весь код по созданию страницы
	//как обычно - запросы к базе данных, парсим шаблоны и т.п.
	//но весь вывод идет в специальный буфер благодаря вызову ob_start() выше
 
	//сохраняем страницу в переменную
	$htmlpage = ob_get_flush();
	//и отправляем содержимое переменной в кеш
	apc_store($apc_key, $htmlpage);
}

Несмотря на краткость статьи этой информации вполне достаточно чтобы начать создавать php-скрипты, которые эффективно используют apc-кеш. Проверено на себе! :)

Более полную информацию о вызовах упомянутых в статье функций можно найти в онлайн-документации по языку PHP.

Если вам понравился этот сайт, вы можете подписаться на rss

Отзывы: 2 комментария

  • Роман
    25 Май 2009 в 20:06

    Интересная статья, спасибо. А у APC есть механизм тегов для записей кеша или что-то подобное, чтоб удалять связанные данные из кеша?

  • admin
    03 Июнь 2009 в 22:29

    Нет, ничего похожего в APC нет.

Ваш отзыв

Имя (*)

E-mail (*)

Сайт

Сообщение

Архивы

службы мониторинга серверов