Кеширование в 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 дней гарантии