Оптимізація сайту на Бітрікс CMS

29 Січня 2019

наступна стаття
Володимир Сідлецький

Back End Developer

Володимир Сідлецький
Оптимізація сайту на Бітрікс CMS

Для того, щоб грамотно розв’язати проблему з оптимізацією сайту на Бітрікс CMS для початку потрібно визначити причину появи труднощів у роботі. Існує кілька способів оптимізації сайтів. До них відносяться:

  • Оптимізація кількості запитів до БД і кількості даних, що з неї обираються;

  • Робота з кешуванням компонентів, HTML кешуванням (композит),

  • Створення фасетних індексів для розумного фільтра.

Давайте предметно поговоримо про деякі з них і спробуємо разом прискорити роботу вашого сайту.

Визначаємо проблему

Почати пошук проблем можна за допомогою стандартного монітора продуктивності і відладчика в адмінпанелі. Вони можуть підказати нам, в якому місці шукати ту чи іншу проблему, пов'язану з навантаженням.

Після проведення налагодження на сторінці можна побачити інформацію про час завантаження тієї чи іншої ділянки і кількість запитів. Зверніть увагу на низ екрану — там виводиться загальна інформація по всій сторінці.

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

Скорочуємо кількість запитів

Бувають моменти, коли потрібно вивести на сайті елементи одного інфоблоку, у яких є властивості з прив'язкою до іншого інфоблоку. Уникайте варіантів отримання значень прив'язаних елементів методом «цикл в циклі»:

$arSortNews = array('ID' => 'asc');
$arFilterNews = array('IBLOCK_ID' => NEWS_ID, 'ACTIVE' => 'Y', 'ACTIVE_DATE' => 'Y');
$arSelectNews = array('NAME', 'PREVIEW_TEXT', 'PROPERTY_PRODUCT');
$dbNews = CIBlockElement::GetList($arSortNews, $arFilterNews, false, false, $arSelectNews);
while ($arNews = $dbNews->Fetch())
{
    $dbProduct = CIBlockElement::GetList(array(), array('IBLOCK_ID' => PRODUCT_ID, 'ID' => $arNews['PROPERTY_PRODUCT_VALUE']));
    $arProduct = $dbProduct->Fetch();
    $arProducts[$arProduct['ID']]['NAME'] = $arProduct['NAME']);
}

Це призведе до великої кількості запитів до бази даних. Для скорочення їх кількості можна зробити вибірку одним запитом по фільтру. Щоб це виправити робимо наступне: в початку прописуємо код також, як і раніше, але в циклі записуємо ID прив'язаних елементів в масив:

$arSortNews = array('ID' => 'asc');
$arFilterNews = array('IBLOCK_ID' => IB_NEWS_ID, 'ACTIVE' => 'Y', 'ACTIVE_DATE' => 'Y');
$arSelectNews = array('NAME', 'PREVIEW_TEXT', 'PROPERTY_PRODUCT', 'ID');
$dbNews = CIBlockElement::GetList($arSortNews, $arFilterNews, false, false, $arSelectNews);
while ($arNews = $dbNews->Fetch())
{
	   $arProductsID[$arNews['ID']] = $arNews['PROPERTY_PRODUCT_VALUE'];
}

Далі робимо вибірку вже з інфоблоку, в якому знаходяться ці прив'язані елементи, одним запитом:

If(!empty($arProductsID)){
 	       $arSelectProducts = array('NAME');
    $dbProduct = CIBlockElement::GetList(array(), array('IBLOCK_ID' => IB_PRODUCT_ID, 'ID' => $arProductsID), false, false, $arSelectProducts);
    while($arProduct = $dbProduct->Fetch()){
        $arProducts[$arProduct['ID']]['NAME'] = $arProduct['NAME']);
    }
} 

Важливо! Не забуваємо перевірити на порожнечу створений масив $arProductsID, інакше можна тільки погіршити ситуацію. Обов'язково потрібно зробити вибірку всіх елементів інфоблоку, і кількості даних, що обираються (тільки потрібні нам поля — NAME).

Кешування компонентів

У всіх стандартних компонентів Бітрікс присутній функціонал автоматичного кешування компонентів. Але не скрізь він буває включений і трапляється таке з найрізноманітніших причин. Щоб виключити повторну обробку коду всередині компонентів, рекомендується все-таки його використовувати. Для кешування потрібного коду всередині компонента можна використовувати просту конструкцію:

	
if ($this->StartResultCache($cacheTime, $cacheParams))
{
		//код, що кешується
} 

Як перший параметр даного методу можна вказати час кешування (за замовчуванням береться з параметра компонента CACHE_TIME). Другий параметр впливає на залежність кешу від додаткових параметрів, наприклад, ID елемента або сторінка, де цей елемент виводиться.

Для використання будь-яких даних поза шаблоном з внутрішнім компонентом даної конструкції, ви можете використовувати SetResultCacheKeys. Як параметри цей метод буде приймати масив ключів. Після цього такі значення можна буде використовувати в component_epilog.php, який не кешується.

$this->SetResultCacheKeys(array('ALL_IDS'));
var_dump($arResult['ALL_IDS']) // виведення в component_epilog.php

У разі, коли ви використовуєте свої власні компоненти або просто підключаєте будь-який важкий код, для сторінок можливо використовувати клас CPHPCache:

$cacheTime = 86400; // час кешування
$cacheId = 'cacheId'; // id облісті, що кешується
$cachePath = '/cache/path'; // шлях зберігання файлів кешу
$obCache = new CPHPCache();
if ($obCache->InitCache($cacheTime, $cacheId, $cachePath))
{
$arRes = $obCache->GetVars();
// $obCache->Output(); // метод для виведення закешованого html
}
else
{	
		// $obCache->StartDataCache(); // метод для початку кешування html
		// тут знаходиться код, який потрібно закешувати
		$obCache->EndDataCache(array("DBResult" => $arRes));
} 

Композит

Бітрікс використовує технологію композитного сайту, який дозволяє зробити кеш повністю згенерованої сторінки, що дає можливість при наступному завантаженні не обробляти весь код і не звертатися до БД, а просто видавати готовий html-код. Але простим включенням технології потрібного результату добитися не вдасться. За замовчуванням, у всіх компонентах виключена підтримка «композиту». Для правильної роботи потрібно пройтися по компонентах і, в залежності від їх роботи, проставити в шаблонах метод $this->setFrameMode(true) якщо він повинен підтримувати технологію, і $this-> createFrame () -> begin () — якщо він є повністю динамічним. Але коли динамічних зон з'являється кілька, кожну з них можна вкласти всередину коду:

$myFrame = $this->createFrame()->begin(); 
// код 
$myFrame->end(); 

Більш детальну інформацію про кешування і композитну технологію можна знайти в документації.

Фасетний індекс розумного фільтра

Знаєте, як працює розумний фільтр? Він перебирає, наприклад, усі товари інтернет-магазину і порівнює значення їх властивостей, що може займати чимало часу. Фасетний індекс заздалегідь прораховує всі варіанти, і при певному запиті видає готовий результат. Прискорте роботу фільтра в кілька разів ...

Є ще варіанти прискорення роботи сайту:

  1. Вимкніть модулі, що не використовуються. При ініціалізації ядра Бітрікс підключає безліч модулів, але використовуються вони не всі, а свій внесок в плані навантаження вони вносять.

  2. Змініть, якщо це потрібно, версію PHP на новішу. Наприклад, при переході на версію PHP7, як показують тести, приріст продуктивності збільшується на 35 і вище відсотків. Як вам таке?)

  3. Ще трохи про кешування. При зазначенні часу кешування компонента, потрібно враховувати частоту оновлення даних. Для прикладу — час кешування новини можна встановити рівним 2 доби (172800 секунд), а для оновлюваних даних в слайдері на головній сторінці — 2 години (7200).

  4. Увімкніть об'єднання і стиснення файлів JS і CSS. Це робиться в налаштуваннях головного модуля в розділі «Оптимізація CSS». Але іноді порядок підключення скриптів впливає на роботу функціонала. Тут потрібен індивідуальний підхід.

Крайній лайфхак

І наостанок. Якщо сервер, на якому знаходиться ваш сайт не підтримує нові технології, надає мало пам'яті і побудований на не дуже сучасному «залізі», міняйте ваш сервер. Це одна з ключових характеристик швидкості роботи сайту☺.


Схожі статті
Записатись на консультацію

Ми зв'яжемось з Вами протягом 10 хвилин