В веб-разработке существует ряд задач, которые не привязаны ни к действиям пользователя.

Например, обновление курсов валют, регулярные рассылки и уведомления, чистка мусора, ротация лог-файлов.

Реже к этим задачам относят продолжительные фоновые задания: пересчет цен, скидок, обмен данными.

В системе сразу после установки уже созданы агенты, они важны для корректной работы фреймворка.

У разработчика есть возможность создавать свои агенты для решения задач проекта.

Агенты могут исполняться в конце загрузки страницы после отрисовки html для браузера или по cron’у. В первом случае становится важно — есть ли посетители на сайте, потому что без них агенты не будут выполняться, и первые пользователи, посетившие сайт после длительного простоя, запустят все накопившиеся агенты.

Агенты создаются через API или интерфейс административного раздела, данные об агентах сохраняются в БД.

Есть три важных параметра агента: функция, интервал и тип.

Функция — строка с вызовом php-функции или метода, обязательно с символом «;» в конце, т.к. эта строка будет исполнена через eval.

Интервал задается в секундах и определяет, как скоро после прошлого запуска агента он запустится еще раз.

Есть 2 типа агентов: с запуском через заданный интервал или точно в указанное время. Например, пересчет рейтинга по оценкам посетителей должен производиться 1 раз в час. Но если на сайте сутки не было посетителей, неправильно вызвать агент 24 раза, достаточно лишь единожды. Это агент, работающий через заданный интервал.

А вот агент с точным указанием времени действительно в таком случае сработает все 24 раза.

Полезно

Подробнее о разнице типов рассказано в документации в материале Агенты и их использование.

На php-код, отвечающий за выполнение агента, накладываются некоторые ограничения:

  • Нельзя использовать переменную $USER.
  • Нельзя проводить авторизацию.
  • Нельзя использовать константу SITE_ID, так как агент может выполняться в административном разделе, а там она инициализируется иначе.
  • Если агент не завершился за 10 минут, система считает, что произошла ошибка и вызовет агент снова.
  • Если агент повторяющийся — он должен возвращать строку, eval которой приведет к его вызову.

Чтобы отслеживать агенты, разработчик может проверить их время последнего запуска и запланированное время следующего в списке агентов в разделе администратора, или воспользоваться константой BX_AGENTS_LOG_FUNCTION.

Если объявить эту константу (например, в init.php) и указать в ней имя объявленной функции, то эта функция будет вызываться при запуске каждого агента и при его завершении, передавая в аргументах параметры. Обычно в таких функциях производится печать в лог-файл, чтобы далее в ходе анализа можно было понять, какие агенты не отрабатывают до конца, какие выполняются слишком долго.

В реальных проектах запуск агентов лучше переносить на планировщик задач cron, чтобы не зависеть от посещаемости. Это легко сделать, если сайт установлен на сервер с BitrixVM. По умолчанию в виртуальной машине cron уже включен.

Меню BitrixVM возьмет на себя конфигурирование сайта и добавления правила в crontab. Если BitrixVM нет, или конфигурация сайта нетиповая, разработчик должен будет выполнить настройку самостоятельно.

Настраивая crontab самостоятельно, не забудьте про параметр sendmail_path, для задания корректного отправителя E-mail. При настройке через BitrixVM параметр будет задан автоматически.

Никогда не совмещайте эти два варианта! Настраивая crontab самостоятельно, отключите задачи на cron в меню BitrixVM, и наоборот.

Практика

Создадим агент, отправляющий администратору сайта сводку о новых элементах инфоблоков, добавленных с прошлого запуска агента.

Агенты

7 мин