Блог Горошко Андрея 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

Сила связей в D7 ORM: JOIN’ы и ReferenceField на практикеСила связей в D7 ORM: JOIN’ы и ReferenceField на практике

Средний рейтинг Еще нет оценок Мы уже умеем выбирать данные из одной таблицы с помощью getList. Но настоящая мощь ORM проявляется, когда нужно в одном запросе получить связанные данные из нескольких

Как изменить группу маркировки товара в BitrixКак изменить группу маркировки товара в Bitrix

Средний рейтинг Еще нет оценок В Bitrix существует несколько способов изменить пользовательское свойство «Группа маркировки» (UF_PRODUCT_GROUP) у товара. Рассмотрим два основных метода и определим, какой из них предпочтительнее. Метод 1:

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

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