Skip to content

Latest commit

 

History

History
76 lines (54 loc) · 4.47 KB

agent.md

File metadata and controls

76 lines (54 loc) · 4.47 KB

Агенты

Тяжеловесные или отложенные операции на сайте удобно выполнять в фоновом режиме, иногда с определённой периодичностью, иногда практически моментально. Помочь в этом может система очередей. Но в некоторых случаях, когда не требуется шардирование и отказоустойчивость подсистемы выполнения отложенных операций, можно воспользоваться штатной технологией «Битрикса» — агентами. К сожалению, эта технология имеет сырое API, но Console Jedi предоставляет свой API, покрывающий весь цикл работы с агентами.

Жизненный цикл

Настройка

Переведите выполнение агентов на cron, если ещё не сделали этого. В Console Jedi этот процесс автоматизирован, поэтому, в отличии от официального руководства, достаточно выполнить команду:

vendor/bin/jedi agent:on-cron

Создание

PHP-класс агента либо должен наследовать класс \Notamedia\ConsoleJedi\Agent\Agent, либо подключать трейт \Notamedia\ConsoleJedi\Agent\AgentTrait, позволяющие объекту класса работать в режиме агента.

Вот и всё, больше не требуется никаких операций. И самое главное — не нужно создавать в классе статичные методы, как это рекомендует официальная документация «Битрикса», — Console Jedi умеет превращать объекты (с конструктором и публичными нестатичными методами) в формат, ожидаемый «Битриксом».

Регистрация

В момент, когда потребуется зарегистрировать в «Битриксе» новый агент, воспользуйтесь специальным строителем
\Notamedia\ConsoleJedi\Agent\AgentTask.

Давайте зарегистрируем агент модуля vasya.tester, при выполнении которого будет создаваться объект TestAgent с аргументами arg1 (строка) и true (булевый тип) и вызываться метод объекта execute с аргументом 100500 (строка):

use Notamedia\ConsoleJedi\Agent\AgentTask;
use Vendor\Module\TestAgent;

AgentTask::builder()
    ->setClass(TestAgent::class)
    ->setConstructorArgs(['arg1', true])
    ->setCallChain([
        ['execute' => [100500]]
    ]),
    ->setModule('vasya.tester')
    ->create();

За подробным описанием методов строителя агентов обратитесь к PHPDoc-комментариям в классе AgentTask.

Выполнение

Добавьте в crontab вызов команды, которая производит выполнение готовых к работе агентов:

vendor/bin/jedi agent:execute

Продление жизни агента

Если время выполнения агента превышает 10 минут, необходимо периодически в процессе его работы выполнять пинг, чтобы «Битрикс» не считал его зависшим. Например:

public function execute($param1)
{
    // Начало выполнения тяжёлых операций
     
    $this->pingAgent(20, ['execute' => [$param1]]);
     
    // Завершение выполнения
}