Разработка на 1С-Битрикс Михаил Базаров
Блог-note

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

Просмотров: 921
В Битриксе очень легко сделать страницу, которая просто отдаёт 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С-Битрикс

Стоимость разработки сайта зависит от объёма и сложности проекта. Ниже приведены ориентировочные цены, как правило не выходят за обозначенные рамки. Срок разработки зависит от сложности проекта: как правило называю сроки с запасом.

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

Включено в стоимость разработки

В цену уже заложено всё, что нужно для легального и быстрого запуска. Доплачивать за базовые вещи не придётся.

  • Лицензия и модули

    Лицензия на «1С-Битрикс» нужной редакции, дополнительные модули и видео-инструкции по работе с готовым проектом.

  • Скорость и SEO

    Оптимизация кода и сервера под быструю загрузку, базовая SEO-оптимизация и добавление сайта в поисковые системы.

Блог-note

Заметки по 1С-Битрикс