Блог Горошко Андрея 1C-Битрикс Создание и управление Агентами в Битрикс для фоновых задач

Создание и управление Агентами в Битрикс для фоновых задач

Средний рейтинг
Еще нет оценок

Агенты в 1С-Битрикс — это механизм для выполнения PHP-функций по расписанию. Они идеально подходят для задач, которые не должны выполняться во время загрузки страницы пользователем:

  • Периодический импорт/экспорт данных.
  • Отправка email-рассылок.
  • Очистка логов или временных файлов.
  • Генерация отчетов.
  • Пересчет цен или остатков.

Как работают агенты?

Существует два режима работы агентов:

  1. На хитах пользователей (по умолчанию): При каждом открытии страницы сайта Битрикс проверяет, не пришло ли время запустить какой-либо агент. Это простой способ, но он создает дополнительную нагрузку и не гарантирует точное время запуска.
  2. На cron: Рекомендуемый способ для production-сайтов. На сервере настраивается задача cron, которая с определенным интервалом (например, каждую минуту) вызывает специальный скрипт /bitrix/php_interface/cron_events.php. Это гарантирует своевременный запуск и снимает нагрузку с посетителей.

Структура функции-агента

Функция-агент должна соответствовать строгому формату.

  1. Это должна быть либо глобальная функция, либо статический метод класса.
  2. Она обязательно должна возвращать строку с собственным вызовом для повторного запуска.
  3. Если задача агента выполнена полностью и его больше не нужно запускать, он должен вернуть пустую строку «» или 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, фоновые задачи Битрикс.

Мой рейтинг:

Добавить комментарий

Related Post

Отладка и Логирование в Битрикс: Инструменты разработчикаОтладка и Логирование в Битрикс: Инструменты разработчика

Средний рейтинг Еще нет оценок Ни один разработчик не может обойтись без инструментов отладки. В Битрикс есть несколько способов посмотреть, что происходит «под капотом», от самых простых до продвинутых. 1.

Управление выводом в Битрикс: Буферизация контента и RestartBufferУправление выводом в Битрикс: Буферизация контента и RestartBuffer

Средний рейтинг Еще нет оценок Весь HTML-код, который генерируется на странице Битрикс, не отправляется в браузер сразу. Он накапливается в специальном буфере вывода. Только после того, как отработает эпилог (epilog_after.php), Битрикс

Всплывающие окна в Битрикс: Создание и управление с помощью BX.PopupWindowВсплывающие окна в Битрикс: Создание и управление с помощью BX.PopupWindow

Средний рейтинг Еще нет оценок Всплывающие (модальные) окна — неотъемлемая часть современного интерфейса. Битрикс предоставляет мощный и гибкий JS-класс BX.PopupWindow для их создания и управления. Шаг 1: Базовое создание окна Для создания