Перейти к содержимому

Кэш не срабатывает - страница собирается заново каждый раз

Кэширование включено, а страницы собираются заново на каждом запросе. Разбираем причины по убыванию частоты, начиная с панели отладки.

С чего начать

Смотрим, собирается страница заново или берётся из кэша:

if ($USER->IsAdmin()) {
define('BX_SHOW_STAT', true); // время сборки и число запросов к базе
}
// одинаковое число запросов при каждом обновлении означает работу без кэша
// панель показывают только администратору: посетителю эти цифры не нужны

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

Ищем пользозависимые данные в ключе кэша:

Окно терминала
grep -rn '\$_SERVER\|GetID()\|session_id' /home/bitrix/www/local/templates/*/components/ | head
# адрес, пользователь и данные браузера в кэшируемом шаблоне ломают попадание

Ключ кэша складывается из параметров, и любое меняющееся значение делает его уникальным. Такой кэш пишется на каждый запрос и не читается никогда, добавляя к медленной странице ещё и работу с диском.

Смотрим объём и права каталога кэша:

Окно терминала
du -sh /home/bitrix/www/bitrix/cache /home/bitrix/www/bitrix/managed_cache
find /home/bitrix/www/bitrix/cache -maxdepth 3 -type d -not -writable | head
# растущая папка при неверных правах - типовая пара симптомов

Каталог кэша с неверными правами приводит к тому, что старые файлы не удаляются, а новые не читаются. Объём растёт, попаданий нет, и место на диске заканчивается раньше, чем находится причина.

Проверяем настройку кэширования у компонента:

$APPLICATION->IncludeComponent('bitrix:news.list', '', [
'CACHE_TYPE' => 'A', // A - по настройке сайта, N - без кэша
'CACHE_TIME' => 3600,
'CACHE_GROUPS' => 'N', // выдача не зависит от прав посетителя
]);
// учёт групп удваивает число вариантов кэша на каждой группе

Учёт прав хранит отдельный вариант кэша для каждой группы пользователей. На сайте с десятком групп это означает десяток вариантов одной и той же страницы, и попаданий в кэш становится заметно меньше.

Задаём маску прав для файлов кэша:

/bitrix/php_interface/dbconn.php
umask(000);
@umask(~BX_DIR_PERMISSIONS); // иначе файлы кэша создаются недоступными

Причины

  1. В ключ кэша попали пользозависимые данные примерно 30% случаев

    ПризнакКаталог кэша быстро растёт, а число запросов к базе на странице не падает.

    ПроверкаИщем в кэшируемых шаблонах обращения к пользователю, сеансу и переменным окружения.

    Что делатьУбираем такие значения из ключа кэша: он должен зависеть только от параметров вывода.

  2. Компонент кэшируется отдельно для каждой группы примерно 20% случаев

    ПризнакКэш работает, но попаданий мало, а сброс помогает не всем посетителям сразу.

    ПроверкаСмотрим, включён ли у компонента учёт прав, и считаем число групп пользователей.

    Что делатьОтключаем учёт прав там, где выдача от него не зависит, либо сокращаем число групп.

  3. Кэширование выключено настройками примерно 20% случаев

    ПризнакПанель отладки показывает полный набор запросов даже на неизменной странице.

    ПроверкаПроверяем тип кэширования у компонента и общую настройку автоматического кэширования.

    Что делатьВключаем автоматическое кэширование и задаём компонентам осмысленное время жизни кэша.

  4. Файлы кэша не пишутся или не читаются примерно 15% случаев

    ПризнакКаталог кэша растёт и не чистится, в журнале ошибки доступа к файлам.

    ПроверкаСмотрим права на каталог кэша и свободное место на разделе с сайтом.

    Что делатьВыравниваем права на каталог и задаём маску прав в файле подключения к базе.

  5. Кэш сбрасывается слишком часто примерно 15% случаев

    ПризнакКэш работает первые секунды после сброса, а затем снова исчезает.

    ПроверкаСмотрим, что меняет данные: обмен, агент или скрипт, правящий элементы каждую минуту.

    Что делатьРазносим массовые правки во времени и не сбрасываем кэш целиком там, где хватает тега.

Частые вопросы

Почему кэш не сбрасывается по тегу?

Тегированный сброс работает только при включённом управляемом кэше. Без соответствующего признака у компонента теги регистрируются, но ни на что не влияют.

Насколько большим может быть каталог кэша?

На больших сайтах он занимает гигабайты, и это нормально. Ненормально - когда он растёт без остановки: значит, старые файлы не удаляются.

Стоит ли ставить большое время жизни кэша?

Для редко меняющихся блоков - да. Для товарных списков это опаснее: посетитель увидит старую цену, если сброс по тегу не настроен.

Почему сброс кэша из админки помогает не всем?

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

Как понять, что страница пришла из кэша?

По числу запросов к базе и времени сборки в панели отладки. Разница между попаданием и промахом видна сразу и не требует замеров секундомером.

Смежное

Первоисточник