Перейти к основному содержимому

Типы кеша

Кеширование в битриксе (Инфраструктурный)

Прежде чем Битрикс начнет работать, сам PHP использует свои механизмы:

  • OPcache (Bytecode Cache): PHP — интерпретируемый язык. При каждом запуске скрипт читается, анализируется и компилируется в байт-код. OPcache сохраняет этот байт-код в оперативной памяти.
    • Зачем: Ускоряет выполнение скриптов в разы. Это база, без него Битрикс будет тормозить.
  • Static Cache (внутри одного хита): Это то, что ты видел в коде модуля xpage.core (static $cache = []).
    • Как работает: Данные сохраняются в переменной внутри функции на время выполнения одного запроса страницы.
    • Зачем: Если ты вызываешь getIblockId 10 раз за одну страницу, реальный код сработает 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)

Уникальная технология Битрикса.

  1. Отдает пользователю мгновенно статичный HTML-каркас (из кэша).
  2. В фоне дозагружает динамические данные (корзину, имя пользователя) через JS.
  • Результат: Страница визуально открывается за 0.05 сек.

Где физически лежат данные (Storage)

В файле bitrix/.settings.php можно настроить, куда именно Битрикс будет складывать кэш.

  1. Файлы (/bitrix/cache/ и /bitrix/managed_cache/):
    • Плюсы: Работает везде «из коробки».
    • Минусы: Медленно при большом объеме данных. Если файлов миллионы, файловая система начинает тормозить (дисковый I/O).
  2. Memcached:
    • Плюсы: Данные хранятся в оперативной памяти (RAM). Очень быстро.
    • Минусы: Если сервер перезагрузится, кэш пропадет. Не поддерживает тегированное кэширование напрямую (Битрикс эмулирует его через файлы или дополнительные ключи).
  3. Redis (Рекомендуется):
    • Плюсы: Тоже в памяти, но умеет сохранять данные на диск. Очень быстрый. Идеально подходит для больших проектов и тегированного кэша.
    • Как включить: Требуется установка расширения на сервер и настройка в .settings.php.
  4. APCu:
    • Кэш в памяти конкретного процесса PHP. Очень быстрый, но работает только в рамках одного сервера и не очень удобен для больших объемов.

Резюме для разработчика (как в xpage.core)

Когда ты пишешь код, следуй этой иерархии:

  1. Локально в методе: Используй static $cache, чтобы не делать лишних действий внутри одного хита (как в getProperties).
  2. Для запросов к БД: Используй встроенный в ORM кэш:
    'cache' => ['ttl' => 3600, 'cache_joins' => true]
  3. Для тяжелых расчетов: Используй Bitrix\Main\Data\Cache.
  4. Следи за временем: В Битриксе принято ставить очень большое время жизни кэша (TTL), например, год (31536000), потому что Managed Cache сам удалит его, когда данные реально изменятся. Нет смысла сбрасывать кэш раз в час, если данные в инфоблоке меняются раз в месяц.

Почему $ttl в классе ibclok такой огромный (8 лет)?

private static int $ttl = 8 * 365 * 24 * 60 * 60;

Потому что это настройки метаданных (ID инфоблока, коды свойств). Они меняются крайне редко (только разработчиком). Битрикс сам очистит этот кэш, если ты зайдешь в настройки инфоблока и нажмешь «Сохранить». В остальное время этот код вообще не должен нагружать базу данных.