Как ускорить AJAX и служебные страницы в Битриксе с помощью define()

Просмотров: 75

В Битриксе очень легко сделать страницу, которая просто отдаёт JSON, и так же легко случайно запускает половину ядра ради одного поля из базы. Это не только замедляет работу, но и создаёт лишнюю нагрузку на сервер.

Проблема: Нужно быстро отдать статус заказа по его id

Типичная задача: на странице заказа нужно раз в несколько секунд получать его текущий статус через AJAX — без перезагрузки страницы. Нам нужно:

  • загрузить заказ по ID;
  • взять STATUS_ID;
  • вернуть JSON.

Не нужно что бы скрипт запускал модули и обрабатывал:

  • статистика посещений;
  • агенты;
  • события ядра;
  • админ-панель;
  • сбор аналитики;
  • лишние SQL-запросы.

Но по умолчанию Битрикс делает всё это даже для простого AJAX-запроса. Если, просто, реализовать вывод JSON:

<?php
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog.php");
echo json_encode(['status' => 'P']);
?>

Битрикс думает что:

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

Cервер уже успел выполнить гораздо больше лишней работы чем того требовалось.

define() установки в Битриксе — это переключатели, которые ядро читает во время инициализации. Важно: все define() должны быть объявлены до подключения prolog.

Пример задачи с отключением не нужных задач

Файл: /ajax/order_status.php. Который:

  • принимает order_id;
  • возвращает статус заказа в JSON;

Минимальный набор флагов оптимизации

В скрипте, до подключения ядра и выполнения основной полезной нагрузки скрипта, задаем такие параметры:

<?php
// Установки
define('NO_KEEP_STATISTIC', true);
define('NO_AGENT_STATISTIC', true);
define('DisableEventsCheck', true);
define('BX_PUBLIC_MODE', true);

// Дальше ядро и полезная нагрузка
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");

use Bitrix\Sale\Order;

$order = Order::load((int)$_GET['order_id']);

if (!$order) {
    echo json_encode(['error' => 'Order not found']);
}

echo json_encode([
    'status' => $order->getField('STATUS_ID')
]);

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php");
?>

define('NO_KEEP_STATISTIC', true);

Нужно всегда для AJAX и API-файлов. Отключает:

  • запись хитов в статистику;
  • лишние SQL-запросы;
  • подсчёт посещений.

define('NO_AGENT_STATISTIC', true);

Критично для быстрых запросов, особенно при частых polling запросах. Отключает:

  • подсчёт и запуск агентов;
  • проверку планировщика.

define('DisableEventsCheck', true);

Убирает «магические» тормоза. Отключает:

  • глобальные события (OnPageStart, OnPageEnd);
  • кастомные обработчики.
Внимание: использовать только если вы точно знаете, что события тут не нужны.

define('BX_PUBLIC_MODE', true);

Включает облегчённый режим. Не подключает:

  • админ-панель;
  • публичные меню;
  • лишние элементы интерфейса.

Этот флаг идеально подходит для:

  • AJAX;
  • JSON-выдачи;
  • API.

Что мы выиграли

Без define С define
30–60 SQL-запросов 5–10 SQL
Агенты Отключены
Статистика Отключена
События Отключены
Админка Отключена
Медленно Быстро

Когда НЕ стоит всё отключать

Эти флаги не подходят, если: это полноценная страница, нужны события, работает логика, завязанная на агенты;

Дополнительные флаги, которые могут встречаться

<?php
define('STOP_STATISTICS', true);
?>

Старый синоним NO_KEEP_STATISTIC. Используется в старом коде, в новых проектах лучше применять NO_KEEP_STATISTIC.

<?php
define('PUBLIC_AJAX_MODE', true);
?>

Используется в некоторых компонентах Битрикса. Внешне похож на BX_PUBLIC_MODE, но применяется реже и не является обязательным.

<?php
define('ADMIN_SECTION', true);
?>

Говорит ядру, что это административный раздел. Не используется для оптимизации AJAX и публичных страниц.

Если задача — быстро отдать данные и не тратить ресурсы сервера впустую, правильный набор флагов обязателен. Используйте их осознанно — и Битрикс будет работать значительно быстрее.

Стоимость разработки на 1С-Битрикс:

Индивидуальная разработка магазина

от 500 000 руб. от 5-ти недель

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

Запуск сайта на готовом решении

от 100 000 руб. от 7-ми дней

Вариант для тех, кто не хочет тратить много средств на индивидуальный проект, и не имеет серьезных требований к сайту. Магазин, быстро запускается на базе одного из 200-та готовых решений.

Мобильное приложение

от 500 000 руб. от 1-го месяца

Разработка кроссплатформенного мобильного приложения, которое не уступает нативным решениям как в производительности, так и пользовательском опыте. Публикуется в AppStore, GooglePlay и RuStore

Сайт компании

от 350 000 руб. от 1-го месяца

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

Инфресурс

от 400 000 руб. от 5-ти недель

Информационный ресурс любой сложности. Сайт для СМИ, городской портал или многопользовательская доска объявлений. Внутренние форумы, блоги- по необходимости.

Лечение сайтов от вирусов

от 40 000 руб. от 2-х дней

Выполню полную проверку сайта и окружения. В случае обнаружения вирусов проведу полный комплекс лечения проекта и закрытия лазеек.