Что такое агенты
Для выполнения каких-либо действий в назначенный момент используются агенты, основная информация в документации учебный курс и cправка API.
Агент, это запись в специальной таблице которая содержит:
- Когда код нужно выполнить
- С каким периодом код нужно выполнять
- Каким способом назначать время следующего запуска агента,
периодический
илинепериодический
агент
Когда пользователь зашел на страничку сайта, ядро Битрикса смотрит есть ли агенты, время которых наступило и выполняет их. В начале хита еще не объявлена переменная $USER
, её в агентах использовать нельзя. Можно в агенте создать объект $USER
, что-то с ним сделать и уничтожить. Реальное время запуска агента обычно чуть-чуть позже, чем время на которое назначен агент. Момент запуска, это когда кто-то зашел на страницу сайта.
Повторяющийся и неповторяющийся агент
Исторически агенты называются периодические
и непериодические
, хотя правильнее было бы сказать: повторяющиеся
и неповторяющиеся
:
Агенты, прежде всего бывают повторяющиеся или неповторяющиеся, это зависит от программиста, который написал код агента. Если функция агента возвращает вызов себя через return
, значит агент повторяется. Именно по return
битрикс понимает что выполнился агент.
Тип агента зависит от программиста, который написал код агента. Программист может сделать агента, который повторится бесконечное число раз. Или только 2-3 раза в зависимости от условий. Пример функций агентов повторяющихся бесконечное число раз:
function TestAgentPeriod()
{
AddMessage2Log( "Периодический BX_CRONTAB:".BX_CRONTAB." BX_CRONTAB_SUPPORT:".BX_CRONTAB_SUPPORT );
return "TestAgentPeriod();";
}
function TestAgentNotPeriod()
{
AddMessage2Log( "Непериодический BX_CRONTAB:".BX_CRONTAB." BX_CRONTAB_SUPPORT:".BX_CRONTAB_SUPPORT );
return "TestAgentNotPeriod();";
}
Вычисление следующего времени запуска
Для повторяющихся агентов есть смыл говорить об интервале запуска и способе вычисления времени следующего запуска. В данном примере интервал агентов 15 секунд. Один агент периодический, другой непериодический:
Этот способ позволяет запустить агент точное число раз. Назначенное время следующего запуска периодического (точно в указанное время)
агента вычисляется так:
Старое назначенное время агента + интервал
Назначенное время следующего запуска непериодического (через заданный интервал)
агента вычисляется так:
Время завершения последнего запуска агента (выполнение return) + интервал
Например, агент пересчета рейтингов запускается раз в час. Но если за сутки не было ни одного посетителя, то логичнее выполнить агент один раз и сдвинуть назначенное время следующего запуска на час вперед после запуска. В случае строго периодического агента, этот код выполнился бы все 24 раза в сутки.