Агенты Битрикс — встроенный планировщик задач. Они выполняются при каждом запросе к сайту (или по реальному cron) и позволяют запускать PHP-код по расписанию без настройки системного cron.
Как работают агенты
Битрикс хранит список агентов в таблице b_agent. При каждом хите проверяется: не пришло ли время запустить какой-нибудь агент. Если да — выполняется функция и планируется следующий запуск.
Регистрация агента
// Регистрируем агент — запускать каждые 3600 секунд (1 час)
\CAgent::AddAgent(
'MyModule\\Agents\\CleanupAgent::run()', // функция/метод
'mymodule', // модуль (можно пустую строку)
'N', // не разовый
3600, // интервал в секундах
'', // дата первого запуска (пустая = сразу)
'Y', // активен
'', // следующий запуск (авто)
30 // приоритет
);
echo 'Агент зарегистрирован';
Функция агента
Функция должна возвращать своё имя для повторного запуска, или пустую строку для однократного выполнения:
namespace MyModule\Agents;
class CleanupAgent
{
public static function run(): string
{
// Логика агента
$db = \Bitrix\Main\Application::getInstance()->getConnection();
$db->query(
'DELETE FROM b_my_log WHERE DATE_CREATE < DATE_SUB(NOW(), INTERVAL 30 DAY)'
);
// Логируем
\Bitrix\Main\Diag\Debug::writeToFile(
'Cleanup done: ' . date('Y-m-d H:i:s'),
'',
'/bitrix/logs/cleanup.log'
);
// Возвращаем имя метода — агент запустится снова
return __CLASS__ . '::run()';
}
}
Управление агентами программно
// Получить список всех агентов
$agents = \CAgent::GetList(
['NEXT_EXEC' => 'ASC'],
['MODULE_ID' => 'mymodule']
);
while ($agent = $agents->Fetch()) {
echo $agent['NAME'] . ' — ' . $agent['NEXT_EXEC'] . PHP_EOL;
}
// Деактивировать агент
\CAgent::DisableAgent($agentId);
// Удалить агент
\CAgent::RemoveAgent(
'MyModule\\Agents\\CleanupAgent::run()',
'mymodule'
);
// Запустить принудительно (сброс времени)
\CAgent::Execute($agentId);
Проблема: агенты не запускаются
Частая проблема — агенты не выполняются если на сайте мало трафика. Решение — подключить реальный cron:
# Добавляем в crontab (запускать каждую минуту)
* * * * * /usr/bin/php /var/www/html/bitrix/modules/main/tools/cron_events.php >> /var/log/bitrix-cron.log 2>&1
В настройках Битрикс (Настройки → Инструменты → Агенты) включите режим cron: «Агенты работают через cron».
Отладка агентов
// Временно добавить вывод в лог
define('AGENT_CHECK_PERIOD', 1); // проверять каждую секунду (только для отладки!)
// В php.ini или начале скрипта агента
ini_set('error_log', '/bitrix/logs/agents.log');
Агент vs реальный cron
| Критерий | Агент Битрикс | Системный cron |
|---|---|---|
| Настройка | Из кода/админки | Доступ к серверу |
| Точность времени | Зависит от трафика | Точная (±1 минута) |
| Тяжёлые задачи | Тормозит сайт | Изолированный процесс |
| Портабельность | Вместе с кодом | Нужна настройка сервера |
Итог
Агенты Битрикс — удобный способ для лёгких задач по расписанию. Для production-проектов всегда подключайте реальный cron — это даёт точное время выполнения и не замедляет пользовательские запросы.
