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

Правка не видна на сайте - какой кэш сбросить

Данные в админке изменены, а сайт показывает прежнее. Разбираем причины в порядке убывания частоты - все они про разные уровни кэша.

С чего начать

Смотрим, что вообще включено:

echo COption::GetOptionString('main', 'component_cache_on', 'Y'), "\n"; // кэш компонентов
echo COption::GetOptionString('main', 'composite_mode', 'N'), "\n"; // композит
echo defined('BX_COMP_MANAGED_CACHE') ? 'управляемый кэш включён' : 'выключен', "\n";
// значения по умолчанию видны, если настройку ни разу не меняли руками
echo COption::GetOptionString('main', 'component_managed_cache_on', 'Y'), "\n";
// управляемый кэш компонентов включают вместе с константой, а не вместо неё

Уровней кэша три, и они вложены друг в друга. Пока не ясно, какой из них отдаёт старое, сброс «всего сразу» лечит симптом, не объясняя причины и обнуляя работу кэша для всех посетителей.

Проверяем, отдаётся ли страница из композита:

Окно терминала
curl -sI https://example.com/catalog/ | grep -iE 'x-bitrix-composite|cache'
# страница из композита помечается служебным заголовком ответа
curl -sI -H 'Cache-Control: no-cache' https://example.com/catalog/ | grep -i cache
# разница между двумя ответами показывает, кэширует сам сайт или посредник
# параметр ncc=1 в адресе просит платформу собрать страницу мимо копии

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

Сбрасываем точечно, а не всё подряд:

// кэш конкретного компонента на странице
BXClearCache(true, '/catalog/');
// управляемый кэш инфоблока: сбрасывается сам при правке элемента
CIBlock::CleanCache($iblockId);
// композит целиком
CHTMLPagesCache::getInstance()->deleteAll();
// после сброса первый заход собирает страницу заново и отвечает медленнее

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

Причины

  1. Кэш компонента ещё живёт примерно 35% случаев

    ПризнакПравка видна в админке, на витрине - старое, через час само исправляется.

    ПроверкаСмотрим время жизни кэша у компонента, который выводит эти данные.

    Что делатьСбрасываем кэш этого компонента и включаем управляемый кэш, чтобы правка применялась сразу.

  2. Страница отдаётся композитом примерно 25% случаев

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

    ПроверкаСмотрим служебные заголовки ответа: у композитной страницы они свои.

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

  3. Правка сделана не в том месте примерно 20% случаев

    ПризнакНикакой сброс не помогает, данные на сайте другие с самого начала.

    ПроверкаПроверяем, тот ли инфоблок, тот ли сайт и тот ли шаблон правились.

    Что делатьПравим нужный источник: на мультисайте и при двух инфоблоках это самая частая история.

  4. Кэш браузера или прокси примерно 12% случаев

    ПризнакУ одного человека старое, у другого свежее, в режиме инкогнито всё верно.

    ПроверкаОткрываем страницу с обходом кэша браузера и смотрим заголовки ответа.

    Что делатьПравим заголовки кэширования для страниц и добавляем метку версии к статике.

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

    ПризнакПравка в файле шаблона не применяется, хотя файл на сервере изменён.

    ПроверкаСверяем время изменения файла с тем, что отдаёт сайт, и смотрим настройки ускорителя.

    Что делатьСбрасываем кэш ускорителя или перезапускаем процессы PHP после выкладки.

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

Почему нельзя просто выключить кэш?

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

Что такое управляемый кэш?

Режим, в котором кэш компонента сбрасывается сам при изменении связанных данных. Он и решает большую часть жалоб «правка не видна».

Как проверить правку, не сбрасывая кэш?

Открыть страницу с параметром обхода кэша либо посмотреть данные напрямую в админке. Полный сброс ради проверки - лишний шаг.

Помогает ли перезапуск веб-сервера?

Он сбрасывает кэш ускорителя PHP, но не трогает кэш компонентов и композит. Как универсальное лекарство он не работает.

Смежное

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