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

Как создать агента в своем модуле 1С-Битрикс

Внимание! Все сообщения на форуме проходят модерацию. Ваше сообщение появится после проверки.
В 1С-Битрикс агент — это PHP-функция, выполняемая по расписанию. По сути, это запись в таблице b_agent, которую ядро вызывает либо при хитах, либо через cron.
Правильный способ регистрации агента внутри собственного модуля:

Агент добавляется в методе DoInstall()
Удаляется — в DoUninstall()
Код
/local/modules/vendor.module/install/index.php

Регистрация агента
Код
use Bitrix\Main\ModuleManager;

class vendor_module extends CModule
{
    public function DoInstall()
    {
        ModuleManager::registerModule($this->MODULE_ID);
        $this->installAgents();
    }

    public function DoUninstall()
    {
        $this->unInstallAgents();
        ModuleManager::unRegisterModule($this->MODULE_ID);
    }

    protected function installAgents()
    {
        \CAgent::AddAgent(
            "\\Vendor\\Module\\Agent::run();", // что вызываем
            $this->MODULE_ID,                  // модуль
            "N",                               // не привязан к хитам
            300,                               // интервал (сек)
            "",
            "Y",
            "",
            100
        );
    }

    protected function unInstallAgents()
    {
        \CAgent::RemoveAgent(
            "\\Vendor\\Module\\Agent::run();",
            $this->MODULE_ID
        );
    }
}

Сам агент в /local/modules/vendor.module/lib/Agent.php:
Код
namespace Vendor\Module;

class Agent
{
    public static function run()
    {
        // логика

        return "\\Vendor\\Module\\Agent::run();";
    }
}

Агент обязан вернуть строку вызова
Если вернуть false или пустую строку — агент удалится.

Указывайте полный namespace
Битрикс хранит строку буквально.
Нельзя писать:
Код
Agent::run();

Нужно:
Код
\\Vendor\\Module\\Agent::run();
3. Проверяйте, что агент не добавляется дважды
$res = \CAgent::GetList([], [
    "NAME" => "\\Vendor\\Module\\Agent::run();",
    "MODULE_ID" => $this->MODULE_ID
]);

if (!$res->Fetch()) {
    \CAgent::AddAgent(...);
}
Не используйте агенты если:
- задача выполняется >20–30 секунд
- требуется высокая точность по времени
- возможны параллельные запуски
- большой объём данных

В этих случаях лучше:
- cron + CLI-скрипт
- очередь (RabbitMQ, Redis)
- отдельный worker
Форма ответов
 
Текст сообщения*
Перетащите файлы
Ничего не найдено
 

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