Как проверить, какой агент в Битрикс выполняется долго
Агенты в 1С-Битрикс используются для выполнения отложенных и регулярных задач: отправки писем, очистки кеша, обмена с 1С, обновления индексов, обработки заказов, генерации файлов и других фоновых операций.
Если сайт начал тормозить, страницы долго открываются, а нагрузка на сервер выросла, одной из причин может быть агент, который выполняется слишком долго или зависает.
Что такое агент в Битрикс
Агент — это PHP-функция или метод класса, который Битрикс запускает автоматически через определённый интервал времени.
Например, агент может запускаться раз в 10 минут, раз в час или раз в сутки. В старых проектах агенты часто выполняются на хитах пользователей, то есть при открытии страниц сайта. В более правильной настройке агенты выносятся на cron.
Почему долгие агенты опасны
Если агент выполняется слишком долго, он может создавать заметную нагрузку на сайт. Особенно это критично, если агенты запускаются не через cron, а на посещениях пользователей.
В этом случае обычный посетитель открывает страницу сайта, а вместе с этим Битрикс пытается выполнить фоновую задачу. Если задача тяжёлая, страница может открываться медленно или вообще завершиться ошибкой.
Где посмотреть список агентов
Список агентов находится в административной части Битрикс:
Настройки → Инструменты → Агенты
Также можно открыть страницу напрямую:
/bitrix/admin/agent_list.php
В списке агентов можно увидеть название агента, периодичность запуска, дату последнего выполнения и дату следующего запуска.
Но важный минус этого раздела в том, что он не показывает реальное время выполнения агента. Поэтому для поиска долгого агента нужны дополнительные проверки.
Проверка агентов через базу данных
Агенты хранятся в таблице b_agent. Для первичной диагностики можно выполнить SQL-запрос:
SELECT
ID,
NAME,
LAST_EXEC,
NEXT_EXEC,
RUNNING,
IS_PERIOD
FROM b_agent
ORDER BY LAST_EXEC DESC;
Особое внимание стоит обратить на поле RUNNING.
Если у агента долго стоит значение Y, возможно, он завис
или выполняется слишком долго.
Как понять, что агент завис
Признаки проблемного агента:
- у агента долго не меняется дата последнего запуска;
- поле
RUNNINGостаётся в значенииY; - cron выполняется слишком долго;
- в логах PHP появляются ошибки по времени выполнения;
- сайт периодически начинает тормозить без видимой причины.
Проверка времени выполнения cron
Если агенты вынесены на cron, можно проверить общее время выполнения команды:
time php -f /home/bitrix/www/bitrix/modules/main/tools/cron_events.php
Если команда выполняется несколько секунд — это нормально. Если выполнение занимает десятки секунд или минуты, значит среди агентов есть тяжёлая задача.
Логирование выполнения агентов
Чтобы понять, какие агенты выполняются, можно временно добавить логирование.
Например, в файл /bitrix/php_interface/init.php:
AddEventHandler("main", "OnAfterAgentExecute", function($agentName, $result, $agentId)
{
file_put_contents(
$_SERVER["DOCUMENT_ROOT"] . "/agent.log",
date("Y-m-d H:i:s") . " | " . $agentId . " | " . $agentName . PHP_EOL,
FILE_APPEND
);
});
После этого в файле agent.log появится список выполненных агентов.
Но такой способ показывает только факт запуска, а не точное время выполнения.
Как замерить время выполнения конкретного агента
Самый надёжный вариант — добавить замер времени непосредственно в код подозрительного агента.
$start = microtime(true);
// код агента
$duration = round(microtime(true) - $start, 3);
AddMessage2Log(
"Время выполнения агента: " . $duration . " сек.",
"AGENTS"
);
Такой способ особенно полезен для самописных агентов, например импорта товаров, обмена с 1С, рассылок или обработки заказов.
Что делать, если агент выполняется долго
Если найден долгий агент, не стоит сразу его удалять. Сначала нужно понять, какую задачу он выполняет.
Возможные решения:
- оптимизировать SQL-запросы внутри агента;
- добавить фильтры и ограничения выборки;
- разбить обработку на небольшие порции;
- перенести тяжёлую задачу на отдельный cron;
- добавить логирование ошибок;
- проверить индексы в таблицах базы данных;
- отключить агент, если он больше не нужен.
Почему агент лучше выполнять через cron
На боевых сайтах агенты лучше запускать через cron, а не на хитах пользователей. Это снижает влияние фоновых задач на скорость открытия страниц.
При запуске через cron пользователь открывает страницу сайта отдельно, а агенты выполняются в фоне по расписанию. Такой вариант стабильнее и безопаснее для нагруженных проектов.
Частая ошибка: тяжёлый импорт в агенте
Одна из типовых проблем — когда в агент помещают тяжёлый импорт товаров, обновление цен или обмен с внешней системой.
Если такой агент за один запуск пытается обработать тысячи элементов, он может создавать большую нагрузку на базу данных и PHP.
Лучше разбивать обработку на шаги: например, за один запуск обновлять не все товары, а только 100–300 элементов. После этого агент запускается повторно и продолжает работу со следующей порцией данных.
Итог
В стандартном списке агентов Битрикс можно увидеть, какие агенты существуют и когда они запускались, но нельзя сразу понять, какой из них выполняется долго.
Для нормальной диагностики нужно проверять таблицу b_agent,
смотреть поле RUNNING, анализировать cron и добавлять временное логирование.
Если агент действительно выполняется долго, его нужно оптимизировать: уменьшить объём обработки за один запуск, проверить SQL-запросы, вынести тяжёлые задачи на отдельный cron и добавить нормальные логи.
Такой подход помогает найти источник нагрузки и сделать сайт на Битрикс стабильнее.
Комментарии