Ускорить отображение элементов информационных блоков за счет опционального отключения ненужных счетчиков просмотра и ликвидации операции записи в базу

Рейтинг: 5.0268  
Новая
Предложил Пользователь 269 04.05.2017 18:22:26

Ускорить отображение элементов информационных блоков за счет опционального отключения ненужных счетчиков просмотра и ликвидации операции записи в базу

В /bitrix/components/bitrix/news.detail/component.php есть безусловный вызов CIBlockElement::CounterInc($arResult["ID"]);, который, в свою очередь, формирует и посылает в базу данных запрос примерно такого содержания:
UPD ATE b_iblock_element
SE T
  TIMESTAMP_X = TIMESTAMP_X,
  SHOW_COUNTER_START = ifnull(
SHOW_COUNTER_START,
now()
  ),
  SHOW_COUNTER = ifnull(SHOW_COUNTER, 0) + 1
WHERE
  ID = 6515


Таким образом, в таблице b_iblock_element увеличивается переменная SHOW_COUNTER.

Эта переменная далеко не всем нужна.

Не все её используют для изучаения числа просмотров, не всегда она выводится или используется. При использовании nginx с керированием, когда nginx кеширует не только статические файлы, но и динамичекские страницы, счетчик будет отображать неверные данные, и лучше считать обращения, используя анализатор логов nginx.

Я предлагаю опцию отключения модификации счетчика. Это избавит от лишних дорогих операций записи в базу и ускорит отображение элементов информационных блоков для тех, кому счетчики не нужны.

Предлагаю в параметры компонентов информационных блоков добавить еще один - "DISABLE_SHOW_COUNTERS". Если его значение равно „Y” – то счетчики не увеличиваются.

В /bitrix/components/bitrix/news.detail/component.php оборачиваем в условие вызов метода увеличения счетчкика. Код получится следующий:

if (!(array_key_exists("DISABLE_SHOW_COUNTERS", $arParams) && ($arParams["DISABLE_SHOW_COUNTERS"]=="Y";)))
{
          CIBlockElement::CounterInc($arResult["ID"]);
}

В шаблонах, там, где идёт наследование параметров, добавляем и этот параметр. Например, в detail.php, там, где идёт следующий код
<?$ElementID = $APPLICATION->IncludeComponent(
   "bitrix:news.detail",
   "",
   Array(
"DISPLAY_DATE" => $arParams["DISPLAY_DATE"],


добавляем наш новый параметр:

"DISABLE_SHOW_COUNTERS" => $arParams["DISABLE_SHOW_COUNTERS"],


а также добавляем его в те места нашего кода, где мы вызываем компонент информационных блоков, например в

   <?$APPLICATION->IncludeComponent(
   "bitrix:news",

добавляем

"DISABLE_SHOW_COUNTERS" => "Y",




Поддержка нового параметра проблем совместимости со старым кодом не вызвала, доработка кода – минимальная, а выигрыш – существенный: избавились от ненужного обращения к базе, тем более не просто обращения, а операции записи. Это, помимо прочего, удлинит жизнь SSD-дисков