Чтение через кэш
DevBx\Core\IBlockElement и DevBx\Core\IBlockSection — обёртки над CIBlockElement::GetList и
CIBlockSection::GetList, которые кладут выборку в файловый кэш на сутки. Подпись у методов та
же, что у оригиналов: обёртка ставится вместо привычного вызова, менять код выборки не нужно.
Элементы
use DevBx\Core\IBlockElement;
$rs = IBlockElement::GetList(
['SORT' => 'ASC'],
['IBLOCK_ID' => $iblockId, 'ACTIVE' => 'Y'],
false,
['nPageSize' => 20],
['ID', 'NAME', 'DETAIL_PAGE_URL'],
);
while ($item = $rs->GetNext()) {
// ...
}
Возвращается CIBlockResult поверх уже вычитанного массива. Постраничная навигация работает —
параметры листания применяются к кэшированному набору. Но это набор в памяти, а не курсор к
базе: выбирать так миллион элементов нельзя, весь миллион окажется в кэше и в памяти.
IBlockElement::GetByID($id) — тот же GetList с фильтром =ID и выборкой всех полей.
Возвращает выборку, а не массив.
Элемент для показа
$element = IBlockElement::getDisplayElement($elementId);
Отдаёт готовый к выводу массив: поля, развёрнутые через CFile::GetFileArray картинки,
PROPERTIES и DISPLAY_PROPERTIES — значения, пропущенные через
CIBlockFormatProperties::GetDisplayValue в режиме catalog_out. В DISPLAY_PROPERTIES
попадают только заполненные свойства.
Номер меньше или равен нулю — вернётся false без обращения к базе.
Разделы
use DevBx\Core\IBlockSection;
$rs = IBlockSection::GetList(
['SORT' => 'ASC'],
['IBLOCK_ID' => $iblockId, 'ACTIVE' => 'Y'],
false,
['ID', 'NAME', 'SECTION_PAGE_URL'],
);
Устроен так же. Счётчик элементов ($bIncCnt) входит в ключ кэша, поэтому выборка со счётчиком
и без него кэшируются раздельно.
Что нужно знать до того, как поставить обёртку
Ключ кэша — serialize() от всех аргументов. Порядок ключей в фильтре меняет ключ: два
одинаковых по смыслу вызова займут две записи. Объект или замыкание в фильтре сделает ключ
непредсказуемым.
Сброс — по тегу или по времени. Записи помечаются тегом iblock_id_<номер> в пространстве
/iblock, и правка элемента гасит их — но только при включённом управляемом кэше. Без него
правка увидится через сутки.
Сутки — это много. Для витрины, которую правят раз в неделю, это выигрыш; для списка,
который меняется в течение дня, срок надо уменьшать настройкой ib_element_cache_time.
Выключается целиком. Option::set('devbx.core', 'iblock_cache_disabled', 'Y') обнуляет срок
жизни у обоих классов — они начинают работать как прямые вызовы Битрикса. Удобно на время
разбора: подменять вызовы обратно не нужно.