В Bitrix24 можно выполнять код уже после того, как страница отдана пользователю. Это особенно полезно, если нужно запустить какую-то логику, которая не критична для ответа, но должна выполниться: логирование, уведомления, работа с API и т.д.
Что делает addBackgroundJob
Метод добавляет задачу, которая выполнится в том же процессе, но после завершения вывода пользователю. Сам контент уже отправлен, соединение закрыто, а PHP продолжает работать в фоне.
Когда выполняется addBackgroundJob?
Задачи, добавленные через addBackgroundJob, выполняются при вызове метода CMain::FinalActions(). Это завершающая фаза выполнения текущего запроса, когда основная логика уже завершена, и контент отдан браузеру. При этом задача не блокирует процесс, и пользователь не ждёт её завершения.
\Bitrix\Main\Application::getInstance()->addBackgroundJob(
function () {
// код, который выполнится после отдачи страницы
}
);Сигнатура метода
addBackgroundJob(callable $job, array $args = [], int $priority = JOB_PRIORITY_NORMAL);
Аргументы:
$job— функция, метод или замыкание, которое нужно вызвать.$args— массив аргументов для$job.$priority— приоритет выполнения:
const JOB_PRIORITY_NORMAL = 100; const JOB_PRIORITY_LOW = 50;
Примеры использования
1. Вызов агента
\Bitrix\Main\Application::getInstance()->addBackgroundJob(
['CAgent', 'CheckAgents'],
[],
\Bitrix\Main\Application::JOB_PRIORITY_LOW
);2. Запись в журнал событий (CEventLog)
\Bitrix\Main\Application::getInstance()->addBackgroundJob(
function () {
\CEventLog::Add([
"SEVERITY" => "INFO",
"AUDIT_TYPE_ID" => "CUSTOM_EVENT",
"MODULE_ID" => "main",
"ITEM_ID" => "background_job",
"DESCRIPTION" => "Фоновая задача выполнена после отдачи страницы"
]);
}
);3. Отдача файла + Push-сообщение пользователю
Допустим, вы генерируете документ и сразу отдаёте пользователю на скачивание. После этого в фоне отправляете push-сообщение — пользователь получит alert с подтверждением.
use Bitrix\Main\Application;
use Bitrix\Main\Engine\Response\File;
use Bitrix\Main\Loader;
$filePath = $_SERVER['DOCUMENT_ROOT'] . '/upload/generated.docx';
Application::getInstance()->addBackgroundJob(
function ($userId) {
if (\Bitrix\Main\Loader::includeModule('pull')) {
\CPullStack::AddByUser($userId, [
'module_id' => 'main',
'command' => 'custom_action_complete',
'params' => [
'message' => 'Действие выполнено'
]
]);
}
},
[$USER->GetID()]
);
$response = new File($filePath);
$response->setFileName("Документ.docx");
$response->send();
А на фронте — ловим сообщение:
BX.addCustomEvent("onPullEvent-main", function(command, params) {
if (command === "custom_action_complete") {
alert(params.message);
}
});Что важно знать
- Работает только при включённой буферизации вывода (в ядре Bitrix включена по умолчанию).
- Это не асинхронность в привычном смысле — код всё ещё исполняется в рамках текущего PHP-процесса, но выполняется позже, после отдачи страницы.
- В CLI-скриптах метод не имеет смысла — контент там не отдают.
Где это полезно
- Логирование событий, ошибок, действий;
- Вызовы внешних API, если не критична мгновенная реакция;
- Обновление счётчиков, метрик, кэшей;
- Отправка сообщений через Push & Pull;
- Запуск периодических задач без ручного вызова агента.
Заключение
addBackgroundJob — простой способ выполнить дополнительный код после ответа пользователю, не замедляя отдачу страницы. Этот механизм активируется в момент вызова CMain::FinalActions(), что даёт вам гибкость при организации фоновых задач.
Инструмент встроенный, не требует сторонних библиотек и работает из коробки. Если ещё не использовали — самое время попробовать.