Немного теории
Кеширование - прием, позволяющий сохранять результаты работы редко обновляемых или ресурсоемких кусков кода (например, постоянно работающих с базой данных) в специальном хранилище для более быстрого доступа к ним.
В «1С-Битрикс: Управление сайтом» есть несколько видов и механизмов кеширования:
- Кеширование данных (классы CPhpCache, \Bitrix\Main\Data\Cache). Универсальный базовый механизм, на основе которого строятся более сложные механизмы
- Кеширование компонентов. Для ускорения обработки запроса клиента и уменьшения нагрузки на сервер компоненты должны использовать кеширование. Кешировать, как правило, необходимо ту информацию, которая не зависит от конкретного обратившегося пользователя. Например, список новостей сайта идентичен для всех посетителей. Поэтому нет смысла каждый раз выбирать данные из базы.
- HTML кеш, нужен для сохранения целой страницы. С версии 16.0.14 главного модуля данный вид кеширования устарел и заменён технологией Композитный сайт.
- Кеширование меню. Для кеширования меню применяется специальный алгоритм, который учитывает тот факт, что большая часть посетителей - это незарегистрированные пользователи.
При организации кеширования важно определить условия, при которых кеш теряет актуальность. В фреймворке есть возможность для каждого кеша задать время жизни или использовать тегированный/управляемый кеш (чаще всего используется для кеша работы с Инфоблоками).
При настройке компонентов разработчик должен задать тип кеширования этого компонента. Доступны варианты:
- Кешировать. Такие компоненты всегда работают в режиме кеширования.
- Не кешировать. Такие компоненты всегда работают без кеширования.
- Авто+Управляемое. Такие компоненты будут кешировать результат только если в настройках сайта активирована опция “Автокеширование”. Рекомендуется всегда использовать этот тип для компонентов.
В административном разделе на странице Настройки/Настройки продукта/Автокеширование находятся основные элементы управления системой кеширования сайта.
- Кеширование компонентов - Автокеширование. При установке этой опции все компоненты с типом “Авто+Управляемое” начинают кешировать результат. Не рекомендуется отключать эту опцию.
- Управляемый кеш. Технология управляемого кеширования или тегированный кеш (Сache Dependencies) автоматически обновляет кеш компонентов при изменении данных. Подробнее об этой технологии можете узнать в документации. Для небольших сайтов не рекомендуется отключать эту опцию.
- Очистка файлов кеша. На этой вкладке можно запустить полное удаление всего кеша сайта.
Хранение кеша
Технология Сache Dependencies, как и весь продукт, может хранить кеш как в файлах, так и используя Memcached, APC, eAccelerator.
Если используется файловое хранение кеша, то результаты кеширования сохраняются в виде файлов в каталоге /bitrix/cache/. Управляемый кеш хранится в файлах каталога /bitrix/managed_cache/.
Сброс кеша
В процессе разработки кеш может мешать вносить изменения в код сайта. Это не повод отключать кеширование — но нужно научиться очищать кеш. Доступны следующие варианты действий:
- В публичной части использовать кнопку “Сбросить кеш” панели инструментов. Так будет удален кеш всех данных этой страницы для этого пользователя. На кеш других страниц или пользователей это не повлияет. Вариант не подойдет, если нужно сбросить кеш для анонимных пользователей.
- В режиме Правки сайта использовать кнопки для очистки кеша в панели отдельных компонентов.
- Сбросить полностью кеш сайта в административном разделе
- Убедиться, что время кеширования задано оптимально в настройках компонентов. Если вам часто приходится сбрасывать кеш, возможно вы что-то настроили или реализовали неправильно
- В редких случаях: перейти к настройкам выбранных компонентов и перевести их в режим работы без кеширования. Решение подходит для специфических задач, например “вывод случайного отзыва при каждом обновлении страницы”.
Кеширование в компонентах
Для кеширования в компонентах разработано отдельное API, работающее поверх универсального кеширования данных.
Принцип работы кеша компонента:
- Определить параметры, от которых зависит кеш
- Проверить наличие валидного кеша. Если валидного кеша нет, то:
- Выполнить необходимые запросы и сохранить их результат в $arResult
- Подключить шаблон компонента
- Весь выводимый на экран html будет сохранен в кеше
- $arResult будет сохранен в кеше
- Иначе, если валидный кеш есть:
- Вывести html из кеша
- Подключить $arResult из кеша
- Затем подключается файл component_epilog.php шаблона и выполняются финальные операции компонента
Для работы с кешем в компоненте используются методы:
Метод | Назначение |
---|---|
CBitrixComponent::StartResultCache | Если кеш действителен, метод отправляет на экран его содержимое, заполняет $arResult и возвращает False. Если кеш недействителен, метод возвращает True |
CBitrixComponent::EndResultCache | Завершает начатое кеширование $arResult без кеширования html-кода. Вызывается в конце блока получения данных, сохраняемых в кеше (перед закрывающей скобкой), и тогда IncludeComponentTemplate можно вынести из этого блока. |
CBitrixComponent::AbortResultCache | Отменяет начатое кеширование |
CBitrixComponent::ClearResultCache | Очищает кеш компонента |
CBitrixComponent::setResultCacheKeys | Задает список ключей массива $arResult, которые должны кэшироваться при использовании встроенного кэширования компонентов |
В обычном сценарии кеширование завершается после обработки файлов result_modifier.php и template.php шаблона компонента. Таким образом, все что было выведено в результате работы этих файлов, попадает в кеш, а результат работы component_epilog.php — нет.
Чтобы работать в файле component_epilog.php с какими-либо ключами массива $arResult, нужно убедиться, что эти ключи зарегистрированы методом CBitrixComponent::setResultCacheKeys. Метод можно вызвать в result_modifier.php.
Сложное кеширование
При реализации сложной логики может не хватить возможностей стандартного кеширования компонентов. Кроме того, может быть полезно добавить кеширование в некоторые классы, которые не являются компонентами. В таком случае рекомендуется использовать универсальный класс кеширования \Bitrix\Main\Data\Cache.
При работе с классом кеширования напрямую, без CBitrixComponent, разработчик должен самостоятельно определить:
- Время жизни кеша
- Уникальный идентификатор кеша
- Папку, в которой хранится кеш
Такой кеш не умеет перехватывать выводимый в браузер html, в отличие от компонентов, он кеширует только те данные, которые явным образом сохранены в нем методом \Bitrix\Main\Data\Cache::endDataCache.
Если не используется встроенное в компонент кэширование, и при этом вызов IncludeComponentTemplate кэшируется, для связи компонента с данными из объекта \Bitrix\Main\Data\Cache доступны методы CBitrixComponent::SetTemplateCachedData и CBitrixComponent::GetTemplateCachedData.
Управляемое кеширование
Управляемое кеширование помогает решить проблему актуальности данных в публичной части при редактировании их через панель администратора. Работает технология просто: каждый компонент, работающий, например, с Инфоблоком “Новости”, регистрируется в таблице b_cache_tag. В таблице хранится путь к кешу и короткий тег -- в нашем примере это ID Инфоблока “Новостей”.
При любом изменении в этом Инфоблоке все зарегистрированные объекты кеша из b_cache_tag очищаются, а следом очищается и таблица от устаревших записей.
Для регистрации тега используются методы \Bitrix\Main\Data\TaggedCache::startTagCache, \Bitrix\Main\Data\TaggedCache::registerTag, \Bitrix\Main\Data\TaggedCache::endTagCache. Для сброса кеша по тегу: \Bitrix\Main\Data\TaggedCache::clearByTag.
Подробнее об управляемом кешировании можно узнать в документации к продукту.
Для часто обновляемого большого массива данных использование тегированного кеша неоправданно, лучше использовать неуправляемое кеширование. В противном случае вместо экономии системных ресурсов управляемый кеш будет их тратить на постоянное создание и удаление кеша.
Кеш меню
Для кеширования меню применяется специальный алгоритм, который учитывает тот факт, что большая часть посетителей - это незарегистрированные пользователи. Кеш меню управляемый и обновляется при редактировании меню или изменении прав доступа к файлам и папкам через административный интерфейс и API.
Если на сайте много разделов, то размер кеша компонента bitrix:menu может вызвать падение сайта из-за переполнения места на диске. Так происходит из-за того, что для каждой страницы (каждого уникального URL) компонент генерирует отдельный файл кеша.
Устранить падение можно через ручной параметр компонента CACHE_SELECTED_ITEMS, который не отображается в Эрмитаже. Это приведет к тому, что при создании файла кеша меню в ключе не будет участвовать url (для всех страниц сайта будет единый кеш). А расчет выбранного уровня будет происходить после получения данных из кеша.
Практика
В этом видеоуроке мы на примерах покажем использование инструментов платформы 1C-Битрикс для реализации кеширования.
Кеширование. Часть 1
21 мин
Кеширование. Часть 2
15 мин
Полезные ссылки и материалы
- Кеширование
- Кеширование компонентов (Автокеширование)
- Сache Dependencies
- Автокеширование
- Управляемое и неуправляемое кеширование
- Метод CBitrixComponent::StartResultCache
- Метод CBitrixComponent::AbortResultCache
- Метод CBitrixComponent::ClearResultCache
- Метод CBitrixComponent::setResultCacheKeys
- Класс \Bitrix\Main\Data\Cache
- Метод CBitrixComponent::SetTemplateCachedData
- Метод CBitrixComponent::GetTemplateCachedData
- Сache Dependencies (тегированный кеш)
- Проблемы при кешировании меню
- Меню
- Примеры. Кешируем правильно