Документация

Чтение через кэш

DevBx\Core\IBlockElement и DevBx\Core\IBlockSection — обёртки над CIBlockElement::GetList и CIBlockSection::GetList, которые кладут выборку в файловый кэш на сутки. Подпись у методов та же, что у оригиналов: обёртка ставится вместо привычного вызова, менять код выборки не нужно.

Элементы

php
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 и выборкой всех полей. Возвращает выборку, а не массив.

Элемент для показа

php
$element = IBlockElement::getDisplayElement($elementId);

Отдаёт готовый к выводу массив: поля, развёрнутые через CFile::GetFileArray картинки, PROPERTIES и DISPLAY_PROPERTIES — значения, пропущенные через CIBlockFormatProperties::GetDisplayValue в режиме catalog_out. В DISPLAY_PROPERTIES попадают только заполненные свойства.

Номер меньше или равен нулю — вернётся false без обращения к базе.

Разделы

php
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') обнуляет срок жизни у обоих классов — они начинают работать как прямые вызовы Битрикса. Удобно на время разбора: подменять вызовы обратно не нужно.