Проблема: Нужно быстро отдать статус заказа по его 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 и публичных страниц.
Если задача — быстро отдать данные и не тратить ресурсы сервера впустую, правильный набор флагов обязателен. Используйте их осознанно — и Битрикс будет работать значительно быстрее.