По умолчанию агенты и рассылки в Битриксе запускаются на хитах посетителей, что тормозит отдачу страниц и делает выполнение задач непредсказуемым. Перевод на cron убирает эту нагрузку со страниц и обеспечивает регулярный запуск.
define("BX_CRONTAB", true) в /bitrix/php_interface/dbconn.php.Как работают агенты и очередь на хитах
Агенты в 1С-Битрикс — это функции, выполняемые по расписанию (очистка кэша, статистика, индексация поиска, отправка отложенных писем). В стандартном режиме проверка «пора ли запускать агент» происходит на каждом хите посетителя: система при формировании страницы смотрит таблицу агентов и очередь писем и запускает то, чему подошёл срок.
У этого подхода есть очевидные минусы:
- Замедление страниц. Посетитель, которому «повезло» попасть на нужный хит, ждёт выполнения тяжёлого агента.
- Непредсказуемость. Нет трафика — агенты не выполняются вовсе, письма из очереди не уходят.
- Конкурентность. На нагруженном сайте несколько хитов могут пытаться запустить агенты одновременно.
Решение — отключить запуск на хитах и вызывать обработку из системного планировщика cron с фиксированным интервалом.
Включение режима cron в админке
Первый шаг делается в интерфейсе управления сайтом:
- Откройте Настройки → Настройки продукта → Настройки модулей → Главный модуль.
- Найдите блок «Управление агентами и очередью писем на cron».
- Поставьте флажок «Агенты и очередь писем выполняются только на cron».
- Сохраните настройки.
После этого ядро перестаёт запускать агенты и рассылку на хитах и ожидает вызова из планировщика. Важно: сам cron это не настраивает — если вы включили флажок, но не добавили задание в crontab, агенты и письма выполняться перестанут совсем.
Прописываем константу в dbconn.php
Флажок в админке фактически управляет поведением через константу. Надёжнее задать её явно в файле /bitrix/php_interface/dbconn.php:
define("BX_CRONTAB", true);
Дополнительно в момент запуска из планировщика ядро само выставляет служебные значения. Если нужно принудительно указать, что текущий процесс — это агентский вызов, применяется:
define("BX_CRONTAB_SUPPORT", true);
Константа BX_CRONTAB отвечает именно за то, чтобы на обычных хитах агенты не запускались, а BX_CRONTAB_SUPPORT сообщает системе, что окружение поддерживает выполнение по cron. В большинстве проектов на BitrixVM достаточно одного включённого флажка в админке — он выставляет нужный режим автоматически.
Создание задания в crontab
Теперь добавим системное задание. Скрипт запуска агентов расположен в /bitrix/modules/main/tools/cron_events.php. Откройте crontab пользователя, от которого работает сайт (обычно bitrix или www-data):
crontab -e -u bitrix
Добавьте строку запуска раз в минуту:
* * * * * /usr/bin/php -f /home/bitrix/www/bitrix/modules/main/tools/cron_events.php > /dev/null 2>&1
* * * * *— интервал; здесь каждую минуту, что подходит для очереди писем и большинства агентов.- Путь к
phpи к сайту скорректируйте под своё окружение (проверьте командойwhich php). > /dev/null 2>&1подавляет вывод, чтобы cron не слал письма на каждый запуск.
На BitrixVM задание для агентов уже присутствует в системе — проверьте его командой crontab -l -u bitrix, прежде чем добавлять своё, чтобы не задвоить запуск.
Проверка, что cron работает
После настройки убедитесь, что задачи действительно выполняются:
- Откройте Настройки → Инструменты → Список агентов и посмотрите столбцы «Дата последнего запуска» и «Дата следующего запуска» — время должно обновляться.
- Проверьте очередь писем: Настройки → Настройки продукта → Почтовые события — отложенные письма должны уходить без захода посетителей на сайт.
- Запустите скрипт вручную для контроля ошибок:
php -f /home/bitrix/www/bitrix/modules/main/tools/cron_events.php.
Хороший тест «от обратного»: на несколько минут остановите весь трафик (или проверьте ночью) и убедитесь, что дата последнего запуска агентов всё равно двигается — это доказывает, что работает именно cron, а не хиты.
Частые ошибки
Наиболее распространённые проблемы при переходе на cron:
| Симптом | Причина и решение |
|---|---|
| Агенты вообще перестали выполняться | Флажок в админке включён, но задание в crontab не добавлено. Проверьте crontab -l. |
| Письма из очереди не уходят | Cron запускается не от того пользователя или неверный путь к php/сайту. Сверьте пути. |
| Ошибки прав доступа в логах cron | Задание работает не от владельца файлов сайта. Используйте -u bitrix. |
| Агенты запускаются и на хитах, и по cron | Не выставлена BX_CRONTAB либо снят флажок в админке. Включите оба. |
| Задачи дублируются | Задание в crontab добавлено дважды (своё плюс штатное BitrixVM). Оставьте одно. |
Отдельно следите за «зависшими» агентами: если тяжёлый агент выполняется дольше интервала cron, следующий запуск может наложиться. Для длительных задач увеличьте интервал (например, до */5 * * * *) или вынесите такую задачу в отдельное задание.
Итог
Перевод агентов и очереди писем на cron — базовая мера оптимизации любого боевого проекта на 1С-Битрикс. Она снимает нагрузку со страниц, делает выполнение фоновых задач регулярным и не зависящим от трафика.
Короткий чек-лист:
- Включить флажок в Главном модуле и/или задать
BX_CRONTABвdbconn.php. - Добавить задание на
cron_events.phpв crontab нужного пользователя. - Проверить обновление дат в списке агентов и уход писем без трафика.
- Убедиться, что задание не задвоено с штатным заданием BitrixVM.
После этого имеет смысл заняться остальной оптимизацией — кэшированием, memcached и настройкой БД.