Управляемый кеш компонентов Максим, Смирнов программист
Цели управляемого кеширования Описание проблемы: Для комфорта пользователей - высокая скорость создания страниц Высокая скорость обеспечивается использованием кеширования. Кеширование требует понимания от контент менеджеров. Разработчики затрачивают дополнительные усилия для реализации механизмов сброса кеша при изменениях контента. Решение проблемы: Разработка и реализация технологии управления кешем без привлечения дополнительных усилий разработчиков. При минимальных затратах серверных ресурсов.
Идея реализации Компоненты для кеширования используют метод StartResultCache. Связать с файлом кеша некие метки (теги) и сохранить их в БД. При необходимости сброса кеша: по меткам определить файлы кеша удалить их На практике теги привязываются не к файлам, а каталогам.
Как это работает news.list/component.php: news.list/component.php CBitrixComponent::StartResultCache(); CPHPCache::StartDataCache(…, $cachePath); $CACHE_MANAGER->StartTagCache($cachePath); CIBlockResult::GetNextElement/GetNext/Fetch(); $CACHE_MANAGER->RegisterTag("iblock_id_".$res["IBLOCK_ID"]); CBitrixComponent::IncludeComponentTemplate/EndResultCache(); $CACHE_MANAGER->StartTagCache(); CPHPCache::EndDataCache();
Вложенность тегов $CACHE_MANAGER->StartTagCache(«news.list/c45»); $CACHE_MANAGER->RegisterTag(«news_tag»); $CACHE_MANAGER->EndTagCache(); $CACHE_MANAGER->StartTagCache(«iblock.vote/e67»); $CACHE_MANAGER->RegisterTag(«vote_tag»); $CACHE_MANAGER->EndTagCache(); b_cache_tag
Сброс кеша Основные классы модуля используемые в компонентах CIBlock CIBlockSection CIBlockElement Методы модификации данных Add Update Delete $CACHE_MANAGER->ClearByTag("iblock_id_".$IBLOCK_ID); Обработчики событий
Рекомендации по использованию Не подходит для проектов с часто обновляемой информацией т.к. приводит к постоянной генерации кеша. Не подходит для больших объемов кеша т.к. удаление файлов может сильно нагрузить сервер. Не сбрасывается для не детерминистических данных примером может быть дата начала активности элемента.
Спасибо за внимание! Вопросы?