Типы кеша
Кеширование в битриксе (Инфраструктурный)
Прежде чем Битрикс начнет работать, сам PHP использует свои механизмы:
- OPcache (Bytecode Cache):
PHP — интерпретируемый язык. При каждом запуске скрипт читается, анализируется и компилируется в байт-код. OPcache сохраняет этот байт-код в оперативной памяти.
- Зачем: Ускоряет выполнение скриптов в разы. Это база, без него Битрикс будет тормозить.
- Static Cache (внутри одного хита):
Это то, что ты видел в коде модуля
xpage.core(static $cache = []).- Как работает: Данные сохраняются в переменной внутри функции на время выполнения одного запроса страницы.
- Зачем: Если ты вызываешь
getIblockId10 раз за одну страницу, реальный код сработает 1 раз, остальные 9 раз данные возьмутся из переменной в памяти. После завершения запроса (генерации страницы) этот кэш очищается.
Уровень 1С-Битрикс (Фреймворк)
Битрикс делит кэширование на несколько видов:
А. Неуправляемое кэширование (Unmanaged)
Старый подход (CPHPCache). Вы сами говорите: «Сохрани этот массив на 3600 секунд».
- Проблема: Если вы изменили цену товара в админке, кэш об этом не узнает и будет показывать старую цену еще час, пока не выйдет время TTL.
Б. Управляемое кэширование (Managed Cache)
Это «киллер-фича» Битрикса.
- Как работает: Система сама знает, когда данные изменились. Если вы используете методы API Битрикса для изменения элемента инфоблока, Битрикс автоматически находит все файлы кэша, связанные с этим инфоблоком, и удаляет их.
- Пример: Тот самый параметр
'cache' => ['ttl' => 3600]в D7 ORM использует именно управляемый кэш.
В. Тегированное кэширование (Tagged Cache)
Разновидность управляемого. Вы можете пометить кэш своим «тегом» (например, iblock_id_5).
- Когда что-то меняется в инфоблоке №5, Битрикс дает команду: «Удали весь кэш, где есть тег
iblock_id_5».
Г. Кэширование компонентов (Result Cache)
Самый частый вид. В начале компонента пишется $this->startResultCache().
- Битрикс проверяет: есть ли готовый HTML/массив
$arResultдля таких-то параметров компонента. Если есть — просто выплевывает его в браузер, не делая ни одного запроса к БД.
Д. Композитный сайт (Composite)
Уникальная технология Битрикса.
- Отдает пользователю мгновенно статичный HTML-каркас (из кэша).
- В фоне дозагружает динамические данные (корзину, имя пользователя) через JS.
- Результат: Страница визуально открывается за 0.05 сек.
Где физически лежат данные (Storage)
В файле bitrix/.settings.php можно настроить, куда именно Битрикс будет складывать кэш.
- Файлы (
/bitrix/cache/и/bitrix/managed_cache/):- Плюсы: Работает везде «из коробки».
- Минусы: Медленно при большом объеме данных. Если файлов миллионы, файловая система начинает тормозить (дисковый I/O).
- Memcached:
- Плюсы: Данные хранятся в оперативной памяти (RAM). Очень быстро.
- Минусы: Если сервер перезагрузится, кэш пропадет. Не поддерживает тегированное кэширование напрямую (Битрикс эмулирует его через файлы или дополнительные ключи).
- Redis (Рекомендуется):
- Плюсы: Тоже в памяти, но умеет сохранять данные на диск. Очень быстрый. Идеально подходит для больших проектов и тегированного кэша.
- Как включить: Требуется установка расширения на сервер и настройка в
.settings.php.
- APCu:
- Кэш в памяти конкретного процесса PHP. Очень быстрый, но работает только в рамках одного сервера и не очень удобен для больших объемов.
Резюме для разработчика (как в xpage.core)
Когда ты пишешь код, следуй этой иерархии:
- Локально в методе: Используй
static $cache, чтобы не делать лишних действий внутри одного хита (как вgetProperties). - Для запросов к БД: Используй встроенный в ORM кэш:
'cache' => ['ttl' => 3600, 'cache_joins' => true] - Для тяжелых расчетов: Используй
Bitrix\Main\Data\Cache. - Следи за временем: В Битриксе принято ставить очень большое время жизни кэша (TTL), например, год (
31536000), потому что Managed Cache сам удалит его, когда данные реально изменятся. Нет смысла сбрасывать кэш раз в час, если данные в инфоблоке меняются раз в месяц.
Почему $ttl в классе ibclok такой огромный (8 лет)?
private static int $ttl = 8 * 365 * 24 * 60 * 60;
Потому что это настройки метаданных (ID инфоблока, коды свойств). Они меняются крайне редко (только разработчиком). Битрикс сам очистит этот кэш, если ты зайдешь в настройки инфоблока и нажмешь «Сохранить». В остальное время этот код вообще не должен нагружать базу данных.