Иногда нужно сделать выборку неких данных, например, в комплексном компоненте каталога, который не кешируется по умолчанию. Если сделать выборку просто так - запросы к БД будут вызываться при каждом хите, что не есть хорошо. Поэтому лучше в данном случае использовать кастомное кеширование:
$obCatalogSectionAdditionalDataCache = new CPHPCache;
$catalogSectionAdditionalDataCacheID = "CatalogSectionAdditionalDataCache_" . $arResult['VARIABLES']['SECTION_ID'];
if($obCatalogSectionAdditionalDataCache->InitCache(604800, $catalogSectionAdditionalDataCacheID, '/custom_cache/')) {
$arCatalogSectionAdditionalData = $obCatalogSectionAdditionalDataCache->GetVars();
} else {
$obCatalogSectionAdditionalDataCache->StartDataCache(604800, $catalogSectionAdditionalDataCacheID, '/custom_cache/');
CModule::IncludeModule("iblock");
$arCatalogSectionAdditionalData = CIBlockSection::GetList(array("ID"=>"ASC"), array("IBLOCK_ID"=>$arParams["IBLOCK_ID"], "ID" => $arResult['VARIABLES']['SECTION_ID']), false, array("ID", "IBLOCK_ID", "UF_*", "NAME"))->GetNext();
if($arCatalogSectionAdditionalData['UF_BG_IMAGE']) {
$arCatalogSectionAdditionalData['UF_BG_IMAGE'] = CFile::GetPath($arCatalogSectionAdditionalData['UF_BG_IMAGE']);
}
$obCatalogSectionAdditionalDataCache->EndDataCache($arCatalogSectionAdditionalData);
} |
В приведенном примере мы получаем на выходе кешируемый массив $arCatalogSectionAdditionalData, содержащий выборку пользовательских полей текущего раздела. Один раз произошло обращение к БД, а далее в течение недели (604800 секунд) БД никто беспокоить по этому поводу не будет.