Обзор
Работу с инфоблоками в библиотеке ведут четыре класса. Разница между ними — не в наборе полей, а в том, где живёт результат.
| Класс | Когда брать |
|---|---|
DevBx\Core\Iblock |
всё остальное: элементы, разделы, поиск и создание свойств, разбор значений из выгрузки |
DevBx\Core\IBlockElement |
список элементов, который отдаётся часто, а меняется редко |
DevBx\Core\IBlockSection |
то же для разделов |
DevBx\Core\IblockProperties |
описание свойств инфоблока: типы, коды, значения списков |
Подключение модуля
use DevBx\Core\Iblock;
if (!Iblock::includeModule()) {
return;
}
Iblock::includeModule() — это Loader::includeModule('iblock') с запоминанием результата:
второй и последующие вызовы отвечают из статической переменной. Методы Iblock,
IBlockElement и IBlockSection зовут его сами и возвращают false, если модуль не
установлен. Вызывать вручную нужно только перед собственными обращениями к CIBlock*.
Три уровня кэша
Понимать, какой уровень сработал, важнее, чем помнить сроки: они разные, а сбрасываются по-разному.
Память запроса. Статические массивы внутри Iblock — getElement, getSection,
getSectionsArray, getRootSection, geSectionChildIDArray, getSectionByName и внутренний
справочник свойств. Сюда же экземпляры IblockProperties и IblockPropertyEnum. Живут до конца
запроса, сбрасываются только там, где есть refresh().
Файловый кэш. Iblock::getIblockItems — час, Catalog::getCatalogItems — час и только по
запросу, IBlockElement и IBlockSection — сутки. Ключ записи — serialize() от всех
аргументов. Отсюда правило: два вызова, отличающихся только порядком ключей в фильтре, займут
разные записи, а объект или замыкание в фильтре сделает ключ непредсказуемым.
Тегированный кэш. При включённом управляемом кэше (BX_COMP_MANAGED_CACHE) записи
помечаются тегами iblock_id_<номер>, и правка элемента в админке гасит их сама. Управляемый
кэш выключен — остаётся только срок жизни, и правка увидится через сутки.
Настройки
| Настройка | По умолчанию | Что задаёт |
|---|---|---|
iblock_cache_disabled |
N |
Y — выключает кэш IBlockElement и IBlockSection |
ib_element_cache_time |
86400 | срок жизни кэша элементов, секунды |
ib_section_cache_time |
86400 | срок жизни кэша разделов, секунды |
Ни одной из них нет на странице настроек модуля — они задаются только из кода:
\Bitrix\Main\Config\Option::set('devbx.core', 'iblock_cache_disabled', 'Y');