Тяжеловесные или отложенные операции на сайте удобно выполнять в фоновом режиме, иногда с определённой периодичностью, иногда практически моментально. Помочь в этом может система очередей. Но в некоторых случаях, когда не требуется шардирование и отказоустойчивость подсистемы выполнения отложенных операций, можно воспользоваться штатной технологией «Битрикса» — агентами. К сожалению, эта технология имеет сырое 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]]);
// Завершение выполнения
}