Я уже рассказывал о расширении 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 из пакета установки расширения и скопировать его в директорию с сайтом. Теперь зайдя по адресу https://ваш_сайт/apc.php вы увидите на одной странице всю основную статистику по работе APC, которая вам понадобится в ближайшее время.
Особое внимание обратите на эти две таблицы:
- User 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.
https://phpcoder.ws/2009-05/apc-user-cache.html
Просмотров: 2109