Агенты в 1С-Битрикс — это механизм для выполнения PHP-функций по расписанию. Они идеально подходят для задач, которые не должны выполняться во время загрузки страницы пользователем:
- Периодический импорт/экспорт данных.
- Отправка email-рассылок.
- Очистка логов или временных файлов.
- Генерация отчетов.
- Пересчет цен или остатков.
Как работают агенты?
Существует два режима работы агентов:
- На хитах пользователей (по умолчанию): При каждом открытии страницы сайта Битрикс проверяет, не пришло ли время запустить какой-либо агент. Это простой способ, но он создает дополнительную нагрузку и не гарантирует точное время запуска.
- На cron: Рекомендуемый способ для production-сайтов. На сервере настраивается задача cron, которая с определенным интервалом (например, каждую минуту) вызывает специальный скрипт /bitrix/php_interface/cron_events.php. Это гарантирует своевременный запуск и снимает нагрузку с посетителей.
Структура функции-агента
Функция-агент должна соответствовать строгому формату.
- Это должна быть либо глобальная функция, либо статический метод класса.
- Она обязательно должна возвращать строку с собственным вызовом для повторного запуска.
- Если задача агента выполнена полностью и его больше не нужно запускать, он должен вернуть пустую строку «» или false.
Пример правильной функции-агента:
function MyAgentFunction($param1, $param2)
{
// ... здесь выполняется какая-то работа ...
// Возвращаем себя для следующего запуска
return "MyAgentFunction('{$param1}', '{$param2}');";
}
// Или как статический метод класса
class MyAgents
{
public static function myAgentMethod()
{
// ... работа ...
return "\MyAgents::myAgentMethod();";
}
}
Регистрация агента: CAgent::AddAgent
Для добавления нового агента используется статический метод CAgent::AddAgent.
Синтаксис:
CAgent::AddAgent(
"ИмяФункции()", // 1. Имя функции с параметрами
"ID_модуля", // 2. ID модуля (или пустая строка)
"Периодичность", // 3. Y - периодический, N - одноразовый
интервал_в_сек, // 4. Интервал запуска
"дата_первой_проверки", // 5.
"Активность", // 6. Y/N
"дата_первого_запуска" // 7.
);
Пример: Зарегистрировать агент для ежедневного запуска
Этот код можно выполнить один раз, например, в файле миграции или при установке модуля.
// Удаляем старый агент, если он был
CAgent::RemoveAgent('\MyAgents::deactivateOldNews();', 'my_module_id');
// Добавляем новый
CAgent::AddAgent(
'\MyAgents::deactivateOldNews();', // 1. Вызов статического метода
'my_module_id', // 2. ID нашего кастомного модуля
'N', // 3. Агент не периодический (он сам себя перезапустит)
86400, // 4. Интервал - 24 часа (60*60*24)
'', // 5. Дата первой проверки - не важна
'Y', // 6. Активен
ConvertTimeStamp(time() + 60, "FULL") // 7. Первый запуск - через минуту
);
// Класс с логикой агента
class MyAgents
{
public static function deactivateOldNews()
{
CModule::IncludeModule('iblock');
$iblockId = 2; // Новости
$olderThan = new \Bitrix\Main\Type\DateTime();
$olderThan->add("-30 days"); // Ищем новости старше 30 дней
$el = new CIBlockElement;
$rsOldNews = CIBlockElement::GetList(
[],
[
'IBLOCK_ID' => $iblockId,
'ACTIVE' => 'Y',
'<DATE_ACTIVE_FROM' => $olderThan->toString()
],
false,
['nTopCount' => 10], // Обрабатываем по 10 за раз, чтобы не превысить лимиты
['ID']
);
while ($arNews = $rsOldNews->Fetch()) {
$el->Update($arNews['ID'], ['ACTIVE' => 'N']);
}
// Возвращаем себя для следующего запуска
return '\MyAgents::deactivateOldNews();';
}
}
- Обработка по частям: Обратите внимание на nTopCount. Агенты не должны работать слишком долго. Лучшая практика — обрабатывать данные небольшими порциями за один запуск.
Управление агентами
Все зарегистрированные агенты можно посмотреть (и запустить вручную) в административной панели: Настройки -> Инструменты -> Агенты (/bitrix/admin/agent_list.php).
Вывод:
Агенты — незаменимый инструмент для автоматизации рутинных задач. Ключ к их правильному использованию — создание функций, которые работают быстро, обрабатывают данные по частям и корректно возвращают свой собственный вызов для повторного запуска. Для серьезных проектов всегда настраивайте запуск агентов на cron.
CAgent, Битрикс агенты, AddAgent, периодические задачи, cron, agent function, фоновые задачи Битрикс.