283  /  381
Справочник

Агенты и их использование

Просмотров: 141895
Дата последнего изменения: 16.05.2025
Роберт Басыров
Сложность урока:
4 уровень - сложно, требуется сосредоточиться, внимание деталям и точному следованию инструкции.
1
2
3
4
5
Недоступно в лицензиях:
Ограничений нет

Агенты

Агенты – технология, позволяющая запускать произвольные PHP функции с заданной периодичностью. Технически - это запись в специальной таблице:
  • какой код надо выполнить,
  • когда выполнить,
  • с каким периодом выполнять,
  • каким способом назначать время следующего запуска агента (строго периодический или нестрого периодический агент).

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

Как выполнялась проверка наличия агента до версии 20.5.0 Главного модуля.

Примечание: Временная точность запуска агентов напрямую зависит от равномерности и плотности посещаемости сайта. Реальное время запуска обычно чуть-чуть позже, чем время, на которое назначен агент (при равномерной посещаемости). Момент запуска – это когда кто-то зашел на страницу сайта.
Если вам необходимо организовать запуск каких-либо PHP функций в абсолютно точно заданное время, то необходимо воспользоваться стандартной утилитой cron, предоставляемой большинством хостингов.

Кроме этого, не рекомендуется вешать на агенты ресурсоёмкие операции, для них существует фоновый запуск по cron'у.

Чтобы агент выполнился в заданное время, его необходимо зарегистрировать в системе при помощи метода CAgent::AddAgent. Удалить регистрацию можно с помощью функции CAgent::RemoveAgent.

Если функция-агент принадлежит модулю, то перед ее выполнением этот модуль будет автоматически подключаться, а именно будет подключаться файл /bitrix/modules/ID модуля/include.php. В этом случае необходимо убедиться, что функция будет доступна после подключения этого файла.

Если функция не принадлежит ни одному из модулей, то ее необходимо разместить в файле /bitrix/php_interface/init.php. Этот файл автоматически подключается в прологе.

Особенностью создания функций-агентов является то, что в качестве возвращаемого значения эта функция должна вернуть PHP код, который будет использован при следующем запуске данной функции.

Список используемых в системе агентов приводится на странице Список агентов (Настройки > Настройки продукта > Агенты).

Типы агентов

Тип агента определяется по времени следующего запуска агента:

  • Периодические. Запускаются в указанное время.

    Время следующего запуска = время предыдущего запуска + интервал.

  • Непериодические. Запускаются через заданный интервал и только после успешного завершения предыдущего выполнения, что исключает накладки.

    Время следующего запуска = время окончания работы + интервал.

В интерфейсе продукта используются не названия типов, а время запуска:

Периодические агенты при простое системы могут запуститься многократно за короткий срок и создать большую нагрузку. Например, если сайт не работал один час, агент с интервалом 10 минут выполнится 6 раз почти одновременно.

Тип агента зависит от разработчика, который написал код агента. Разработчик может сделать агента, который повторится бесконечное число раз или только 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();";
}

Примеры агентов

  • Периодические. Раз в день запускается агент очистки старых почтовых событий или агент с ежедневным отчетом о посещаемости сайта.

  • Непериодические. Агент пересчета рейтингов запускается раз в час. Но если за сутки не было ни одного посетителя, то логичнее выполнить агент один раз и сдвинуть назначенное время следующего запуска на час вперед после запуска. В случае строго периодического агента, этот код выполнился бы все 24 раза в сутки.

Абсолютное большинство агентов непериодические.

Ограничения

При использовании технологии учтите, что:

  • Переменная USER в агентах отсутствует. Точнее она может быть создана на сервере хостинга, но нет никакой гарантии, что это будет объект класса CUser.
    При необходимости рекомендуется создавать в агенте объект $USER, что-то с ним сделать и уничтожить.
  • В агентах нельзя проводить авторизацию методом Authorize.
  • Отсутствует константа SITE_ID, так как агент может выполниться и на странице административного раздела.
  • На многоязычных сайтах нельзя заранее узнать какой будет язык.
  • Агенты выполняются в однопоточном режиме с блокировкой на MySQL на 10 минут. Новый вызов агента возможен только после того, как отработает предыдущий вызов. Блокировка БД может потеряться если закроется соединение с ней. 10 минут ожидания это - дополнительная защита от повторного запуска, агентов которые не корректно отработали.

Дополнительно

Список ссылок по теме:





63
Курсы разработаны в компании «1С-Битрикс»