Кеш Битрикс: когда чистить и как не сломать

Коротко

Страницы белые, изменения не видно - первая мысль: сбросить кеш. Разбираем порядок сброса и случаи, когда кеш вообще не виноват.

Симптом
Правки не появляются на сайте

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

Причина
Кешей несколько, и они живут в разных местах

Кеш - собранная копия страницы или данных, которую Битрикс хранит и отдаёт без пересчёта, пока та не устареет.

Перечислю четыре вида кешей, с которыми вы работаете девять раз из десяти:

  • файловый кеш компонентов и страниц - готовые куски HTML и результаты выборок, /bitrix/cache/;
  • управляемый кеш - копии настроек: инфоблоки, свойства, меню, шаблоны (..top.menu.php - как раз «меню»), /bitrix/managed_cache/;
  • opcache PHP - компилированный байт-код .php-файлов, его держит сам PHP, Битрикс тут не при чём;
  • браузер - ваша собственная копия страницы, отдаёт её пока не истечёт Cache-Control;

Оттого и симптом, что «пол-страницы обновилось»: кусок отдаётся из старого кеша, кусок пересчитался заново.

Решение
Порядок чистки: от лёгких к тяжёлым

Шаг 1. Сброс файлового кеша в админке

Админка: Настройки -> Настройки продукта -> Автокеш. Кнопка очистки файлов кеша - основной инструмент. Один полный сброс чистит оба вида: файловый и управляемый.

После полного сброса первые хиты сайта идут медленнее обычного: Битрикс пересобирает всё с нуля. Это нормально. Если правок было много, подождите минуту и продолжайте.

Шаг 2. Сброс из командной строки

Когда правки идут скриптом (миграция, выкладка на сервер), кеш чистят те же руки, что меняли данные. В PHP-сценарии достаточно одной функции:

одноразовый скрипт сброса кеша
<?php
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");

// true - полный сброс (файловый + управляемый)
BXClearCache(true);

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

Шаг 3. Если кеш не виноват

Если правки всё ещё не видны, идём дальше по цепочке:

  • откройте страницу в режиме инкогнито - нет ли кеша браузера;
  • если правился .php файл, а opcache на сервере держит время жизни - нужен restart php (проверьте opcache.validate_timestamps);
  • если стоит CDN - сбросьте кеш по URL у CDN.

✓ Делайте так

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

✗ Так не делайте

  • не чистите кеш «на каждый чих» - вы съедите производительность и приучите себя не понимать, что происходило;
  • не ставьте у компонентов "CACHE_TYPE" => "N" «чтобы кеш не мешал» - найдите, кто его держит;
  • не сбрасывайте полный кеш на пике нагрузки - пересборка всё съест на первых хитах.

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

Опасно ли чистить кеш на проде?

Сами по себе данные не теряются: кеш - копия, которую легко собрать заново. Платите временем: первые запросы идут медленнее. На слабом сервере (у нас - 1 ГБ RAM) подождите пару минут перед следующим большим изменением.

Как узнать, что кеш вдруг «не виноват»?

Три быстрых признака: страница работает стабильно - это кеш; в другом браузере правка уже на месте, в вашем нет - это кеш браузера; сброс из админки устранил всё разом - это был файловый кеш Битрикса.

Не получается?

Сам не получилось - не страшно, я такое чиню регулярно. Напишите в Telegram или оставьте заявку - разберёмся.

Константин - Разработчик 1С-Битрикс: чинит и дорабатывает сайты на БУС, пишет код сам.
Этот и другие разборы с меткой БУС - его живая практика. @bitrix_praktik