В веб-разработке существует ряд задач, которые не привязаны ни к действиям пользователя.
Например, обновление курсов валют, регулярные рассылки и уведомления, чистка мусора, ротация лог-файлов.
Реже к этим задачам относят продолжительные фоновые задания: пересчет цен, скидок, обмен данными.
В системе сразу после установки уже созданы агенты, они важны для корректной работы фреймворка.
У разработчика есть возможность создавать свои агенты для решения задач проекта.
Агенты могут исполняться в конце загрузки страницы после отрисовки 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 мин
Полезные ссылки и материалы