Агенты в 1С-Битриксе — это периодические задачи. Через них идут обмен с 1С, пересчёт цен, отправка почты, очистка корзин и рассылки модулей. По умолчанию они запускаются на хитах, то есть когда посетитель открывает сайт.
Почему агенты лучше запускать по cron
Запуск на хитах похож на WP-Cron в WordPress, и проблемы те же:
- ночью нет посетителей — агенты и письма ждут утра;
- долгий агент тормозит страницу — посетитель ждёт, пока выполнится обмен с 1С;
- страницы отдаются из кэша — до PHP запрос не доходит, и агенты не запускаются.
Поэтому для рабочих сайтов агенты переводят на cron. Системный cron раз в минуту запускает скрипт, который выполняет агенты и отправляет почту.
Как перевести агенты на cron
Шаг 1. Отключить агенты на хитах
В административной части откройте «Настройки → Инструменты → Командная PHP-строка» и выполните:
COption::SetOptionString("main", "agents_use_crontab", "N");
echo COption::GetOptionString("main", "agents_use_crontab", "N");
COption::SetOptionString("main", "check_agents", "N");
echo COption::GetOptionString("main", "check_agents", "Y");
Результат должен быть NN.
Шаг 2. Поправить dbconn.php
В файле /bitrix/php_interface/dbconn.php уберите строки define("BX_CRONTAB_SUPPORT", true); и
define("BX_CRONTAB", true);, если они есть, и добавьте в конец файла:
if (!(defined("CHK_EVENT") && CHK_EVENT === true)) {
define("BX_CRONTAB_SUPPORT", true);
}
Шаг 3. Создать скрипт для cron
Создайте файл /bitrix/php_interface/cron_events.php:
<?php
$_SERVER["DOCUMENT_ROOT"] = realpath(dirname(__FILE__) . "/../..");
$DOCUMENT_ROOT = $_SERVER["DOCUMENT_ROOT"];
define("NO_KEEP_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS", true);
define("BX_NO_ACCELERATOR_RESET", true);
define("CHK_EVENT", true);
define("BX_WITH_ON_AFTER_EPILOG", true);
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
@set_time_limit(0);
@ignore_user_abort(true);
CAgent::CheckAgents();
define("BX_CRONTAB_SUPPORT", true);
define("BX_CRONTAB", true);
CEvent::CheckEvents();
if (CModule::IncludeModule("sender")) {
\Bitrix\Sender\MailingManager::checkPeriod(false);
\Bitrix\Sender\MailingManager::checkSend();
}
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/tools/backup.php");
CMain::FinalActions();
Шаг 4. Добавить задачу в cron
Задача должна работать от того же пользователя, от которого работает сайт. В BitrixVM это bitrix. Если
запускать от root, кэш и загруженные файлы окажутся с чужим владельцем, и сайт начнёт сыпать ошибками
прав.
sudo crontab -u bitrix -e
* * * * * /usr/bin/php -f /home/bitrix/www/bitrix/php_interface/cron_events.php
Путь к сайту замените на свой. Узнать его можно в той же командной PHP-строке:
echo $_SERVER['DOCUMENT_ROOT'];.
Как проверить, что агенты выполняются
В административной части откройте «Настройки → Настройки продукта → Агенты». У каждого агента есть время последнего и следующего запуска. Если у многих агентов время следующего запуска давно прошло, агенты не выполняются.
Проверьте и сам cron. Запущен ли он и запускает ли скрипт, описано в руководстве «Как проверить, что cron выполняется». Быстрее всего запустить скрипт вручную от пользователя сайта и посмотреть, нет ли ошибок:
sudo -u bitrix /usr/bin/php -f /home/bitrix/www/bitrix/php_interface/cron_events.php
Зависший агент
Пока агент выполняется, Битрикс помечает его как запущенный. Если агент упал посреди работы, например по нехватке памяти, пометка может остаться, и агент перестанет запускаться. Найти такие агенты можно запросом к базе:
SELECT ID, NAME, LAST_EXEC, NEXT_EXEC FROM b_agent WHERE RUNNING = 'Y';
Если агент помечен как запущенный давно, а процесса с ним на сервере нет, снимите пометку:
UPDATE b_agent SET RUNNING = 'N' WHERE ID = 123;
Как узнать, что cron встал
Агенты останавливаются тихо. Обмен с 1С перестаёт идти, письма о заказах не уходят, а замечают это, когда звонит клиент. Причины разные: cron удалили при переезде, скрипт падает после обновления Битрикса, сервер сменил часовой пояс.
Чтобы узнавать сразу, добавьте в строку cron запрос к Steadrun после скрипта:
* * * * * /usr/bin/php -f /home/bitrix/www/bitrix/php_interface/cron_events.php && curl -fsS -m 10 --retry 3 -o /dev/null https://steadrun.ru/ping/ВАШ-UUID
Если скрипт упадёт с ошибкой или cron перестанет его запускать, запроса не будет, и придёт алерт в Telegram
или на почту. В Steadrun создайте проверку типа «Cron» с выражением * * * * *. Grace-период поставьте
с запасом на самый долгий агент, например 600 секунд, иначе долгий обмен с 1С будет давать ложные алерты.
Как подключить за пять минут, описано в быстром старте. Бесплатно можно следить за пятью задачами.
Что дальше
- Cron не отрабатывает: чек-лист причин, если cron не запускает скрипт.
- Рецепты: обёртка, которая отправляет в алерт текст ошибки.