Фоновый перевод и агент

Единственный агент модуля

QueueAgent::run();, период 60 секунд. Ставится при установке и обновлении; дубли отсекаются проверкой по имени, потому что сам Битрикс их не отсекает.

Работает, только когда запущено фоновое задание. Простаивающий агент читает состояние и выходит — платной работы не начинает и нагрузки не создаёт.

Останавливает задание после пяти ошибок подряд. Без этого сбой одной пары «инфоблок и язык» превращался бы в бесконечные платные попытки на каждом такте.

Без агента модуль остаётся рабочим. Перевод гонится кнопками из админки, не работает только фоновый режим.

Как включить фоновый перевод

Кнопка «Перевести всё в фоне» на вкладке «Очередь перевода» появляется, только если на сайте включён запуск агентов по расписанию.

Причина: иначе Битрикс выполняет агенты внутри обычных запросов посетителей, и шаг перевода ждал бы случайный посетитель — ровно та беда, от которой фоновый режим должен избавлять.

Три шага:

  1. В файле /bitrix/php_interface/dbconn.php объявите константу BX_CRONTAB_SUPPORT со значением true.

  2. В настройках главного модуля снимите галочку «Автоматически проверять выполнение агентов на хитах».

  3. Добавьте в расписание пользователя, от которого работает сайт, ежеминутный запуск штатного обработчика агентов Битрикса — bitrix/modules/main/tools/cron_events.php.

После этого кнопка появится.

Как остановить перевод

Кнопка «Остановить перевод» на той же вкладке. Она ставит флаг, который проверяется на сервере перед каждым оплачиваемым шагом.

Поэтому останавливается и фоновое задание, и прогон из браузера — даже если вкладка, откуда запускали, уже закрыта.

Задание при этом остаётся на месте: после снятия остановки перевод продолжится с того же места.

Старого агента быть не должно

Агент LangIblockQueue::tick(); удалён из модуля. Он размножал языковые свойства по инфоблокам автоматически, и один лишний язык в настройках Битрикса расползался комплектами свойств по всему проекту.

Класса больше нет, установщик снимает запись при обновлении. Если агент остался, значит обновление не выполнялось, и он падает на каждом такте.