Кэш не срабатывает - страница собирается заново каждый раз
Кэширование включено, а страницы собираются заново на каждом запросе. Разбираем причины по убыванию частоты, начиная с панели отладки.
С чего начать
Смотрим, собирается страница заново или берётся из кэша:
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_cachefind /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', // выдача не зависит от прав посетителя]);// учёт групп удваивает число вариантов кэша на каждой группеУчёт прав хранит отдельный вариант кэша для каждой группы пользователей. На сайте с десятком групп это означает десяток вариантов одной и той же страницы, и попаданий в кэш становится заметно меньше.
Задаём маску прав для файлов кэша:
umask(000);@umask(~BX_DIR_PERMISSIONS); // иначе файлы кэша создаются недоступнымиПричины
-
В ключ кэша попали пользозависимые данные примерно 30% случаев
ПризнакКаталог кэша быстро растёт, а число запросов к базе на странице не падает.
ПроверкаИщем в кэшируемых шаблонах обращения к пользователю, сеансу и переменным окружения.
Что делатьУбираем такие значения из ключа кэша: он должен зависеть только от параметров вывода.
-
Компонент кэшируется отдельно для каждой группы примерно 20% случаев
ПризнакКэш работает, но попаданий мало, а сброс помогает не всем посетителям сразу.
ПроверкаСмотрим, включён ли у компонента учёт прав, и считаем число групп пользователей.
Что делатьОтключаем учёт прав там, где выдача от него не зависит, либо сокращаем число групп.
-
Кэширование выключено настройками примерно 20% случаев
ПризнакПанель отладки показывает полный набор запросов даже на неизменной странице.
ПроверкаПроверяем тип кэширования у компонента и общую настройку автоматического кэширования.
Что делатьВключаем автоматическое кэширование и задаём компонентам осмысленное время жизни кэша.
-
Файлы кэша не пишутся или не читаются примерно 15% случаев
ПризнакКаталог кэша растёт и не чистится, в журнале ошибки доступа к файлам.
ПроверкаСмотрим права на каталог кэша и свободное место на разделе с сайтом.
Что делатьВыравниваем права на каталог и задаём маску прав в файле подключения к базе.
-
Кэш сбрасывается слишком часто примерно 15% случаев
ПризнакКэш работает первые секунды после сброса, а затем снова исчезает.
ПроверкаСмотрим, что меняет данные: обмен, агент или скрипт, правящий элементы каждую минуту.
Что делатьРазносим массовые правки во времени и не сбрасываем кэш целиком там, где хватает тега.
Частые вопросы
Почему кэш не сбрасывается по тегу?
Тегированный сброс работает только при включённом управляемом кэше. Без соответствующего признака у компонента теги регистрируются, но ни на что не влияют.
Насколько большим может быть каталог кэша?
На больших сайтах он занимает гигабайты, и это нормально. Ненормально - когда он растёт без остановки: значит, старые файлы не удаляются.
Стоит ли ставить большое время жизни кэша?
Для редко меняющихся блоков - да. Для товарных списков это опаснее: посетитель увидит старую цену, если сброс по тегу не настроен.
Почему сброс кэша из админки помогает не всем?
Компоненты с учётом прав хранят отдельный кэш для каждой группы, а кнопка сбрасывает кэш групп текущего пользователя. Полный сброс делается отдельно.
Как понять, что страница пришла из кэша?
По числу запросов к базе и времени сборки в панели отладки. Разница между попаданием и промахом видна сразу и не требует замеров секундомером.
Смежное
-
Медленный сайт на практике - оглавление подтемы
-
Монитор производительности: замер, отчёты, поиск узких мест - где видно некэшированные компоненты
-
Правка не видна на сайте: какой кэш сбросить - обратная задача: кэш держится слишком долго
-
Сайт тормозит: разбор причин по убыванию частоты - общий разбор медленной работы
-
Кэширование своей выборки: ключ, теги, сброс - как строят ключ и теги в своём коде
-
Тегированный кэш: сброс по изменению данных, а не по расписанию - связь кэша с источником данных
-
Кэш и сессии в памяти: memcached, Redis, проверка и отказ - где физически лежит кэш
-
Композит не включается на странице: причины по убыванию частоты - соседний механизм кэширования
-
Кеширование в 1С-Битрикс - устройство кэша целиком
-
Путь запроса на витрине: пролог, компоненты, буфер, эпилог - место кэша компонента в сборке страницы