Как закалялся код...: 1C Битрикс кеширование вывода компонента catalog.section.list + тест производительности

понедельник, 1 декабря 2014 г.

1C Битрикс кеширование вывода компонента catalog.section.list + тест производительности

При работе над сайтом консалтинговой компании был создан раздел с услугами. Все услуги разделены на разделы и была поставлена задача в сайдбаре страницы описания услуги выводить другие стати из данного раздела, т.е. меню статей раздела.
Для вывода был использован компонент 1с битрикс catalog.section.list. Код вывода компонента выглядит примерно так:



IncludeComponent(
 "bitrix:catalog.section.list", 
 ".default", 
 array(
  "IBLOCK_TYPE" => "main",
  "IBLOCK_ID" => "3",
  "SECTION_ID" => $_REQUEST["SERVICE_SECTION_ID"], // Задаем фильтр по идентификатору раздела
  "SECTION_CODE" => "",
  "COUNT_ELEMENTS" => "N",
  "TOP_DEPTH" => "1",
  "SECTION_FIELDS" => array(
   0 => "ID",
   1 => "NAME",
   2 => "PICTURE",
   3 => "",
  ),
  "SECTION_USER_FIELDS" => array(
   0 => "",
   1 => "",
  ),
  "SECTION_URL" => "",
  "CACHE_TYPE" => "A",
  "CACHE_TIME" => "3600000",
  "CACHE_GROUPS" => "Y",
  "ADD_SECTIONS_CHAIN" => "N",
 ),
 false,
 array(
  "HIDE_ICONS" => "Y"
 )
);


Как оказалось вывод данного компонента кешируется не зависимо от установленных параметров. Т.е. не зависимо от значения параметра SECTION_ID всегда будет выводиться закешированное значение первого выполнения кода компонента. Поэтому на первое время кеш компонента битрикс был отключен: "CACHE_TYPE" => "N". Когда появилась свободная минутка решил разобраться и проверить.

Изучаем и исправляем компоненты битрикс

Хотя метод используемый для кеширования во всех bitrix компонента StartResultCache по умолчанию должен зависеть от текущего сайта SITE_ID, имени компонента, имени шаблона и входных параметров $arParams, но в данном компоненте зависимость от параметров явно отключена.

Смотрим код компонента catalog.section.list:
/*************************************************************************
   Work with cache
*************************************************************************/
if($this->StartResultCache(false, ($arParams["CACHE_GROUPS"]==="N"? false: $USER->GetGroups())))
{
 if(!\Bitrix\Main\Loader::includeModule("iblock"))
 {
  $this->AbortResultCache();
  ShowError(GetMessage("IBLOCK_MODULE_NOT_INSTALLED"));
  return;
 }


Копируем код компонента битрикс - /bitrix/catalog.section.list в свое пространство имен.
Открываем файл component.php и меняем:



if($this->StartResultCache(false, ($arParams["CACHE_GROUPS"]==="N"? false: $USER->GetGroups())))


На:


if($this->StartResultCache(false, array(($arParams["CACHE_GROUPS"]==="N"? false: $USER->GetGroups()), $arParams)))


Т.е. просто добавляем параметры $arParams к вызову StartResultCache.

Тестируем 1с битрикс

Чтобы убедится в правильности и полезности решения выполним  "Нагрузочный тест пиковой производительности (QP0060)" описание которого можно найти при прохождении тестов "Монитор качества" CMS 1С Битрикс:

Выполнен нагрузочный тест максимальной производительности проекта - " Настройки > Производительность > Панель производительности > Масштабируемость" с исходными данными
  • Начальное количество одновременных соединений = 1
  • Конечное количество одновременных соединений = 5
  • Шаг увеличения одновременных соединений = 1
  • Максимальная продолжительность теста = 5 минут
  • Страница = главная веб-проекта (например - /index.php). Можно выбрать любую посещаемую страниц веб-проекта.
Действуем по инструкции битрикса и запускаем в двух вариантах.
Я запускал несколько раз по 2 минуты, привожу по одному варианту графиков. В целом видел улучшение результата в среднем на 6-9 сотых секунды. И более стабильные показатели для варианта компонента с кешированием.

1. Оригинальный вариант компонента без кеширования.



2. Вариант с кешированием относительно установленных параметров.






1 комментарий:

  1. The 23 Best Casinos in San Diego (San Diego)
    Casinos and hotels in 밀양 출장샵 San Diego: A complete guide 광명 출장마사지 to San Diego casinos, 청주 출장안마 including opening 제주도 출장안마 hours, location maps, photos, and 의정부 출장샵 map.

    ОтветитьУдалить