Yandex Metrika
sanches.free

Кеширование в 1С‑Битрикс: CPHPCache, CPageCache и сброс кеша компонента

Зачем вообще отдельный слой CPHPCache

Рядом с компонентным кешем и Data\Cache в D7 остаётся старый, но предсказуемый контур CPHPCache: вы сами задаёте TTL, строковый ключ и относительный каталог внутри зоны кеша ядра. Удобно обернуть функцию, которая не живёт внутри стандартного компонента, но стоит дорого по CPU или I/O — например агрегацию для виджета или выгрузку из внешнего API с редкими изменениями.

Минимальный цикл: прочитать или пересчитать

Логика всегда одна: попытаться снять готовый набор переменных; если файла нет или он просрочен — выполнить «тяжёлую» ветку и положить результат. Ключ (cache_id) должен отражать все входные параметры, от которых меняется ответ; относительный путь (cache_path) группирует файлы по зоне — так проще чистить кусками.

$engine = new CPHPCache();
$ttlSeconds = 1800;
$slotId = 'vendor_widget_' . (int)$sectionId;
$zonePath = 'widgets/vendor_section/';

$cached = null;

if ($ttlSeconds > 0 && $engine->InitCache($ttlSeconds, $slotId, $zonePath)) {
    $cached = $engine->GetVars();
}

if (!is_array($cached)) {
    $cached = buildVendorWidgetPayload((int)$sectionId);

    if ($ttlSeconds > 0) {
        $engine->StartDataCache($ttlSeconds, $slotId, $zonePath);
        $engine->EndDataCache($cached);
    }
}

// $cached — массив данных для шаблона

Если TTL равен нулю, ветка записи не выполняется: удобно временно отключить кеш флагом конфигурации. Не кладите в EndDataCache несериализуемые ресурсы и объекты с открытыми соединениями — только чистые структуры.

CPageCache и полный HTML

CPageCache рассчитан на сохранение уже собранного HTML целиком. Сценарий схож по духу, но гранулярность другая: чаще его связывают с ускорением отдачи статически выглядящих страниц в обход повторного исполнения цепочки подключений. В композитных и тегированных схемах смысл ручного кеша страницы появляется реже; для типовых витрин чаще окупается настроенный компонентный кеш и CDN.

Очистка: каталог и шаблон компонента

Каталог из примера можно сбросить целиком, если контент в зоне устарел массово (например после импорта):

$engine = new CPHPCache();
$engine->CleanDir('widgets/vendor_section/');

Для инвалидации только одного шаблона публичного компонента удобна статическая очистка кеша по имени:

CBitrixComponent::clearComponentCache('namespace:component.name');

Имя в форме namespace:component должно совпадать с тем, что задано в коде компонента; после вызова пересборка произойдёт на следующих обращениях к странице.

Связь с современным стеком

Компонентные шаблоны и тегированный кеш дают связку «результат + автоматический сброс при правках инфоблоков», чего базовый CPHPCache сам по себе не обещает: инвалидацию по бизнес-событиям вы описываете отдельно или переходите на теги. Имеет смысл держать имена каталогов и ключей в одном стилевом пространству имён решения (company_module/…), чтобы случайная CleanDir() соседа не смела чужую зону.

Краткий чеклист

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

Не хотите копаться сами?

Починю за 1-3 дня. Без предоплаты — оплата по результату.

15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии