ГлавнаяПлагиныКэширование страниц с помощью Batcache для WordPress

Кэширование страниц с помощью Batcache для WordPress

Плагин Batcache позволяет кэшировать страницы в WordPress с помощью механизма кэширования объектов. Batcache используется во многих высоко посещаемых проектах, включая сеть WordPress.com.

Что такое Batcache

Batcache это плагин от создателей популярной сети WordPress.com. Он нацелен на проекты с высокой посещаемостью и в отличие от многих других плагинов кэширования, он прекрасно работает в многосерверной архитектуре.

Плагин Batcache также отличается от большинства аналогов тем, что он выполняет лишь одну задачу — кэширование страниц. Он не кэширует запросы в базу данных или объекты WordPress, он не имеет функции CDN, сжатия, конкатенации или минификации. Он даже не имеет интерфейса для настройки, что многим покажется недостатком, поскольку для его конфигурации приходится работать с кодом PHP.

Основная идея плагина — использование постоянного кэша объектов WordPress для хранения данных. Это позволяет кэшировать страницы на серверах Memcached, Redis, APC и др. При этом сервер кэширования может находится как локально (на том же сервере, что и само веб-приложение), так и удаленно. Именно поэтому Batcache хорошо подходит при работе с более чем одним веб-сервером.

Установка Batcache

Перед тем как приступить к установке плагина, убедитесь в том, что у вас работает плагин для внешнего кэширования объектов, например Memcached Object Cache. Учтите, что для конфигурации большинства плагинов кэширования объектов вам потребуется root-доступ к вашей хостинг-площадке.

Batcache можно скачать из официальной директории WordPress.org, но не спешите его активировать на вашем сайте. Дистрибутив Batcache содержит в себе два отдельных плагина: advanced-cache.php для кэширования страниц и batcache.php (Batcache Manager) для некоторых дополнений к основному плагину.

Плагин Batcache для WordPress

Плагин Batcache для WordPress

Активация основного плагина Batcache происходит путем копирования файла advanced-cache.php из архива в директорию wp-content. Файл (или «drop-in») advanced-cache.php является специальным для WordPress, он исполняется на ранней стадии загрузки ядра, и именно с помощью этого файла реализуется кэширование страниц в WordPress.

После копирования advanced-cache.php в директорию wp-content, необходимо включить его обработку в файле конфигурации wp-config.php с помощью специальной константы:

define( 'WP_CACHE', true );

Убедитесь в том, что константа объявлена до подключения файла wp-settings.php.

Проверка работоспособности плагина

После объявления константы, плагин Batcache начинает автоматически кэшировать страницы. Для того, чтобы проверить его работоспособность, посетите любую страницу вашего сайта и просмотрите ее исходный код. Batcache автоматически добавит туда следующую информацию:

<!--
    generated 207 seconds ago
    generated in 0.450 seconds
    served from batcache in 0.007 seconds
    expires in 93 seconds
-->

Здесь показано, что страница была сгенерирована 207 секунд назад за 0.45 сек. Выдача страницы произошла с помощью Batcache за 0.007 секунд, обновление данной страницы в кэше произойдет через 93 секунды.

Учтите, что по умолчанию Batcache не кэширует страницы для вошедших пользователей, или для тех, кто оставил хотя бы один комментарий на вашем сайте. Чтобы проверить работоспособность лучше воспользоваться режимом инкогнито в вашем браузере (Cmd+Shift+N или Ctrl+Shift+N в Google Chrome).

Настройка плагина Batcache

Как мы упомянули ранее в Batcache нет интерфейса для настройки плагина. Все параметры находятся в исходном коде плагина, а изменения необходимо вносить в глобальном массиве $batcache, который необходимо объявить до исполнения самого плагина.

Создайте в корневой директории новый файл batcache-config.php и подключите его в wp-config.php следующим образом:

require_once( ABSPATH . 'batcache-config.php' );

Строку необходимо разместить до подключения файла wp-settings.php, но после объявления константы ABSPATH. В самом файле batcache-config.php необходимо объявить массив с настройками, который по умолчанию может быть пустым:

<?php
$batcache = array();

Далее в этот массив и в этом же файле мы можем добавлять параметры следующим образом:

$batcache['max_age'] = 600;

Здесь мы устанавливаем 600 секунд для max_age (время жизни одной страницы в кэше). Подобным образом вы можете изменять следующие параметры:

  • max_age — время жизни одной страницы
  • times — количество требуемых посещений, перед тем как страница попадает в кэш
  • seconds — работает вместе с параметром times, сбрасывает счетчик через установленное время
  • debug — установить false для предотвращения вывода информации о кэше в исходном коде страниц
  • group — группа используемая для генерации ключей в кэше объектов. Изменив группу вы можете «сбросить» весь кэш страниц
  • cache_redirects — установите в положение true для того, чтобы кэшировать редиректы

Для удобства плагин объявляет функцию batcache_cancel(), которой можно предотвратить кэширование той или иной страницы в коде вашей темы или любого плагина. Например если вы работаете в режиме Multisite и вам необходимо предотвратить кэш определенного сайта в сети, вы можете воспользоваться следующим кодом в плагине:

add_action( 'init', 'my_cache_control' );
function my_cache_control() {
    if ( get_current_blog_id() == 5 && function_exists( 'batcache_cancel' ) )
        batcache_cancel();
}

Таким образом страницы на сайте с идентификатором 5 кэшироваться не будут.

Массив unique в Batcache

Плагин Batcache имеет специальный массив unique, который используется в построении ключа для кэширования. По умолчанию этот массив пустой, но вы можете им воспользоваться для разделения посетителей на уникальные группы, например в зависимости от установленного cookie в batcache-config.php:

$batcache['unique'] = array();
if ( ! empty( $_COOKIE['my-cookie'] ) )
    $batcache['unique']['my-cookie'] = $_COOKIE['my-cookie'];

Посетитель со значением 1 в куки my-cookie увидит один вариант страницы под одним адресом. Посетитель со значением 2 увидит другой вариант. А посетитель без подобного куки увидит третий вариант, и все три варианта будут выдаваться из кэша. Это полезно если вы хотите например провести A/B тестирование каких-либо страниц.

Таким же образом можно определить уникальные группы например для посетителей с мобильных устройств, с поисковых систем, из определенный стран и прочее.

Игнорирование параметров запроса

По умолчанию Batcache придает значение всем параметрам запроса, включая вспомогательные, например utm_source, utm_medium, utm_campaign и другие параметры Google Analytics, которые не влияют на содержание выводимой страницы.

Для того, чтобы Batcache использовал один единый ключ для кэширования страниц с подобными параметрами и без них, необходимо их «вычистить» из строки запроса. Сделать это можно в файле batcache-config.php:

$ignore_get_keys = array( 'utm_source', 'utm_medium', 'utm_term', 'utm_content', 'utm_campaign' );

parse_str( $_SERVER['QUERY_STRING'], $query );
foreach ( $ignore_get_keys as $key ) {
	if ( isset( $query[ $key ] ) )
		unset( $query[ $key ] );

	if ( isset( $_GET[ $key ] ) )
		unset( $_GET[ $key ] );
}

$_SERVER['QUERY_STRING'] = http_build_query( $query );

В массив $ignore_get_keys можно установить и другие параметры, которые не влияют на содержание выводимой страницы.

Плагин Batcache Manager

Как мы упомянули ранее, в дистрибутиве с плагином Batcache есть вспомогательный плагин Batcache Manager, который вы можете активировать стандартным образом.

Он объявляет полезную функцию batcache_clear_url(), с помощью который можно обновить кэш по определенному адресу. Batcache Manager также использует эту функцию для обновления кэша главной страницы и страницы записи при ее сохранении. Это может быть полезным тогда, когда вы выставили высокое время жизни кэша.

Заключение

Несмотря на дополнительные требования плагина Batcache и на сложности его настройки, мы рекомендуем его попробовать, особенно если речь идет о сайте с высокой посещаемостью. Подобрать правильные параметры для Batcache можно быстро и легко методом проб и ошибок, но не забывайте поглядывать на состояние ваших кэш-серверов.

Если вы уже используете Batcache в ваших проектах, советуем рассмотреть более свежие наработки в официальном репозитории плагина на GitHub, в частности функции vary_cache_on_function() и batcache_stats().

Если у вас возникнут вопросы при работе с плагином Batcache, оставьте комментарий и мы обязательно вам ответим.

Подписаться на рассылку

Подписаться → Подпишитесь на бесплатную рассылку журнала WP Magazine и получайте новости, события, подборки тем и плагинов, уроки, советы и многое другое в мире WordPress!

  • Сделал все по инструкции. Выводится лишь Generated in 5,701 seconds. (103 q), хотя эта штука вроде и раньше выводилась (других пллагинов кеширования даже не устанавливал). Открываю страницу из Инкогнито в Гугл Хроме.

    • Доп. требование — это установка и настройка сервиса memcached или Redis на сервере. Возможно вы пропустили именно этот шаг :)

      • Ой, слона то и не заметил :) теперь понятно про дополнительные требования! Спасибо.

        • Денис

          Вопрос кэширование для зарегистрированных пользователей актуален…

          Константин, что рекомендуете?

          • Очевидно кэшировать страницы целиком никак да и памяти понадобится очень много. Так что для зарегистрированых пользователей просто объектное кеширование. Не так быстро как страница полностью, но тоже значительно быстре получается. Посмотри статьи по кэшированию на этом сайте.

          • Для зарегистрированных пользователей рекомендуем отказаться от кэширования страниц целиком и смотреть в сторону кэширования фрагментов. Такой подход безопаснее и менее требователен к ресурсам сервера.

  • by_roXe

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

    И еще такая проблема, перестали работать счетчитки подсчета просмотров записей, может быть есть какое-то решение для подсчета просмотров которое точно будет работать с кешем?

    Спасибо если ответите)

    • А как вы смотрите «нагрузку на оперативную память»?

      Для количества просмотров используйте внешние инструменты, например Google Analytics или Jetpack Stats для сбора статистики. Если же вам нужно отображать эту статистику на сайте, используйте их соответствующие API.

  • Это не нагрузка а потребление, а на графиках видно лишь суммарное потребление, без разбиения на то, куда именно выделяется эта память, т.е. большая часть этой памяти может быть помечена как cached, что в принципе то же самое, что и «свободная» :)

    Вообще кэширование страниц на потребление памяти особо влиять не должно, а использование Memcached для кэша объектов наоборот должно повысить потребление, ведь кроме локального кэша в процессе PHP у вас теперь информация дублируется на сервере Memcached.

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

    Просмотры в админке можно смотреть в Jetpack Stats и в большинстве плагинов для Google Analytics.

    • by_roXe

      Благодарю за пояснение, а к вам можно обращаться как к специалисту для решения различных вопросов с сервером и wp? И сколько стоят ваши услуги?

  • Anatoly Yumashev

    Спасибо за статью! Ранее думал что это сложно, но нашел виртуальный хостинг с Memcache, а все остальное оказалось просто и понятно. Настроил, теперь кешируемся в память :)

  • Igor Mogilin

    kovshenin, здравствуйте! Не могли бы вы дать ссылку на пример реализации выборочного кеширования в зависимости от типа страниц и/или авторизации пользователей? Заранее спасибо!

  • Здравствуйте! Не подскажете, как запретить для кэширования конкретную страницу (речь о feed/ rss канал).
    Кстати, описанные вами функции в специальном файле batcache-config.php работают и без него — непосредственно в родном файле wp-config.php (проверено, и об этом сказано в readme плагина).
    Я не программист, можно получить прямую инструкцию, то есть конкретную запись в конфиге, где только подставить нужную страницу для запрета кэширования? :)