Заказать проект
Оставьте заявку для получения коммерческого предложения.
Заполните форму и мы вышлем Вам предложение в котором решим,
чем можем вам помочь.
Оптимизация сайта на 1С-Битрикс

Оптимизация сайта на 1С-Битрикс

29 Января 2019
Владимир Сидлецкий
Back End Developer
Владимир Сидлецкий
следующая статья

Для того, чтобы грамотно решить проблему с оптимизацией сайта на 1С-Битрикс для начала нужно определить причину появления затруднений в работе. Существует несколько способов оптимизации сайтов. К ним относятся:

  • Оптимизация количества запросов к БД и количества выбираемых из неё данных,

  • Работа с кэшированием компонентов, 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». Но иногда порядок подключения скриптов влияет на работу функционала. Тут нужен индивидуальный подход.

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

И напоследок. Если сервер, на котором находится ваш сайт не поддерживает новые технологии, предоставляет мало памяти и построен на не очень современном «железе» — меняйте ваш сервер. Это одна из ключевых характеристик скорости работы сайта☺.

Need help?

Ask a question.

Chat Now
Записаться На Консультацию
Записаться На Консультацию
Мы свяжемся
с вами
в течении
10 минут
laptop
Мы свяжемся с вами в течении 10 минут