В 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(), что даёт вам гибкость при организации фоновых задач.

Инструмент встроенный, не требует сторонних библиотек и работает из коробки. Если ещё не использовали — самое время попробовать.