Оставляя настройки кэширования по умолчанию, есть риск по мере увеличения числа страниц столкнуться со значительным ростом кэша меню. Наиболее это заметно на сайтах, где выпадающее меню отображает большое количество разделов и подразделов. Дело в том, что согласно исходным настройкам "Битрикс" создает для каждой страницы индивидуальный кэш меню. Например, на сайте 15000 карточек товаров, и для каждого автоматически создается кэш верхнего меню на 100 килобайт. В итоге получается 1500 мегабайт. Полтора гигабайта! Как же избежать бесполезной траты системных ресурсов и времени на загрузку?
1. Где в "Битрикс" определяется кэш меню?
Это делается в файле class.php по адресу /bitrix/components/bitrix/menu/class.php следующим кодом:
public function getCacheID($additionalCacheID = false)
{
/** @global CMain $APPLICATION */
global $APPLICATION;
/** @global CUser $USER */
global $USER;
$strCacheID = "";
if($this->arParams["MENU_CACHE_TIME"])
{
if($this->arParams["CACHE_SELECTED_ITEMS"])
$strCacheID = $APPLICATION->GetCurPage();
else
$strCacheID = "";
$strCacheID .=
":".$this->arParams["USE_EXT"].
":".$this->arParams["MAX_LEVEL"].
":".$this->arParams["ROOT_MENU_TYPE"].
":".$this->arParams["CHILD_MENU_TYPE"].
":".LANGUAGE_ID.
":".SITE_ID.
""
;
if($this->arParams["MENU_CACHE_USE_GROUPS"] === "Y")
$strCacheID .= ":".$USER->GetGroups();
if($this->arParams["MENU_CACHE_USE_USERS"] === "Y")
$strCacheID .= ":".$USER->GetID();
if(is_array($this->arParams["MENU_CACHE_GET_VARS"]))
{
foreach($this->arParams["MENU_CACHE_GET_VARS"] as $name)
{
$name = trim($name);
if($name != "" && array_key_exists($name, $_GET))
$strCacheID .= ":".$name."=".$_GET[$name];
}
}
$strCacheID = md5($strCacheID);
}
return $strCacheID;
}
Конкретно кэш меню определяется в строках:
if($this->arParams["CACHE_SELECTED_ITEMS"])
$strCacheID = $APPLICATION->GetCurPage();
else
$strCacheID = "";
Пока параметр параметр CACHE_SELECTED_ITEMS включен, для каждой страницы создается свой кэш меню.
2. Теперь как его отключить?
Применим в файле class.php по адресу /bitrix/components/bitrix/menu/class.php следующий код:
<?$APPLICATION->IncludeComponent("bitrix:menu", "top", Array(
"ROOT_MENU_TYPE" => "top", // Тип меню для первого уровня
"MENU_CACHE_TYPE" => "A", // Тип кеширования
"MENU_CACHE_TIME" => "3600", // Время кеширования (сек.)
"MENU_CACHE_USE_GROUPS" => "N", // Учитывать права доступа
...
"CACHE_SELECTED_ITEMS" => "N", // Не создавать кеш меню для каждой страницы
),
false
);?>
Готово!
Назад в раздел