Фоновая обработка и защиты модуля
Сценарии выполняются не в момент сохранения заказа, а чуть позже — в фоне, через очередь. Так сохранение заказа в админке или в корзине не замедляется, а сбой сценария не мешает покупателю оформить заказ. На этой странице — что может задержать или остановить фоновую обработку и как это заметить.
Как заказ попадает к сценариям
- Заказ сохранён — модуль ставит задачу в очередь. Если активных сценариев для сайта заказа нет, задача не ставится вовсе.
- Задача выполняется сразу после ответа браузеру — в конце того же запроса. Это настройка «Запуск очереди сразу после ответа», по умолчанию включена.
- Если задача не выполнилась сразу, её подберёт агент очереди — он запускается раз в минуту.
Сценарии по расписанию работают иначе: отдельный агент раз в заданный интервал (по умолчанию — 60 минут) выбирает заказы и ставит их в ту же очередь, не больше заданного числа заказов за проход. Параметры — в настройках расписания.
Заказ ждёт в очереди
Что произошло. Проверка на заказе говорит «Сработает», а в журнале прогонов строки нет — или она появилась заметно позже сохранения.
Где видно. Окно Агент очереди (кнопка Настройки над списком сценариев → справа вверху): состояние агента и сколько задач ждёт в очереди.
Почему и что делать:
- Агенты Битрикса работают на хитах. Тогда агент очереди запускается, только когда кто-то заходит на сайт, — ночью и на сайте с малой посещаемостью задачи могут ждать долго. Переведите агенты на cron — см. Настройка агентов на cron.
- Выключен запуск сразу после ответа. Тогда очередь разбирает только агент, и задержка составит минуту-две даже при работающем cron.
- В очереди много задач. Когда в очереди больше 50 ждущих задач (например, после массового запуска или выгрузки заказов из учётной системы) новые задачи не выполняются сразу, а ждут агента. Агент разбирает задачи порциями — дождитесь, пока очередь опустеет.
- Агент остановлен вручную кнопкой Остановить агента. Задачи копятся в очереди и будут выполнены после Перезапустить агента.
- Агент не установлен. Модуль восстанавливает агента сам при следующем сохранении заказа. Если состояние не меняется — нажмите Перезапустить агента.
Несколько сохранений подряд — один прогон
Если заказ сохранили несколько раз подряд, пока его задача ещё ждала в очереди, модуль не ставит новую задачу на каждое сохранение, а пользуется уже стоящей. Сценарии отработают один раз — на итоговом состоянии заказа, и в журнале будет одна строка. Условия на изменение («изменилось», «было», «стало») в таком прогоне сравнивают состояние до первого из этих сохранений с итоговым.
Агент остановлен предохранителем
Что произошло. Сценарии перестали срабатывать на всех заказах, хотя они активны и модуль включён.
Где видно:
- в окне Агент очереди — состояние «остановлен предохранителем», а очередь растёт;
- на странице Журнал действий (группа Диагностика) — запись об остановке очереди со списком самых частых ошибок за последний час.
Почему. Если за час в очереди накопилось 100 и больше задач, завершившихся ошибкой после всех повторов, модуль останавливает агента очереди. Массовые ошибки почти всегда значат, что сломано что-то общее — база данных, чужой модуль, сервер, — и разбирать очередь дальше значит плодить ошибки и нагружать сайт.
Что делать.
- Посмотрите в Журнале действий, какие ошибки были самыми частыми, и устраните причину.
- Нажмите Перезапустить агента в окне агента очереди. Если ничего не делать, агент запустится сам при первой новой задаче — например, сохранении заказа — после того, как ошибок за последний час станет меньше порога.
Пока агент стоит, задачи по новым сохранениям заказов копятся в очереди и будут выполнены после перезапуска — ничего не теряется.
Очередь переполнена
Что произошло. Новые заказы перестали обрабатываться сценариями, а в очереди очень много задач.
Где видно. На странице Журнал действий — предупреждение «В очереди сценариев … ждущих задач при потолке 20000: новые задачи не ставятся. Проверьте, что агенты и крон работают». Пишется не чаще раза в час.
Почему. Очередь давно не разбирается: агенты не запускаются, cron не работает, агент очереди остановлен. Чтобы таблица очереди не росла бесконечно, при 20 000 ждущих задач модуль перестаёт ставить новые.
Что делать.
- Проверьте, что агенты Битрикса и cron работают, и что агент очереди в состоянии «работает».
- Дождитесь, пока очередь разберётся.
- Заказы, сохранённые, пока очередь была переполнена, в очередь не попали — обработайте их запуском по заказам с фильтром по периоду.
Массовый запуск обработал не все заказы
Запуск по заказам ставит в очередь не больше 1000 заказов за раз — первые по возрастанию ID. Если под фильтр подпадает больше, модуль предупредит об этом при проверке охвата; остальные запустите отдельно, сузив фильтр.
Большая выборка ставится в очередь порциями: то, что не успело за время запроса, досылается в фоне. Возможные сбои:
- «Очередь сценариев переполнена (задач в ожидании: …) — запустите позже» — запуск отклонён целиком, см. Очередь переполнена;
- очередь заполнилась или сбоила во время досылки — на странице Логи запись «Ошибка массового запуска сценария …» с числом заказов, которые не попали в очередь. Дождитесь, пока очередь разберётся, и запустите сценарий ещё раз на оставшиеся заказы.
Сработала защита от петель
Что произошло. В журнале прогонов итог Пропущен с текстом «Изменения не сохранены: сработала защита от зацикливания».
Где видно. Журнал прогонов по номеру заказа — видно, как сценарии раз за разом меняли один и тот же заказ. На странице Логи — запись «Сценарии сохранили заказ … уже 5 раз за 10 мин — похоже на зацикливание, сохранение остановлено. Сценарии по порядку: #3 -> #7 -> #3 -> …».
Почему. Сценарии сохранили один заказ больше раз, чем разрешено пределом сохранений (по умолчанию — 5 за 10 минут). Типичные причины:
- два сценария «перетягивают» заказ: один ставит значение, другой возвращает обратно;
- сценарий меняет заказ, а обработчик другого модуля или обмен с учётной системой возвращает прежнее значение, и сценарий срабатывает снова.
Что делать. По цепочке в Логах найдите сценарии, которые спорят, и добавьте им условия, чтобы правила не противоречили друг другу. Повышайте предел, только если несколько сценариев законно меняют один заказ много раз подряд.
Условие не удалось проверить
Что произошло. Итог Пропущен с текстом «Условие … не удалось проверить, действия не применялись: …».
Почему. Модуль не смог узнать значение для условия, поэтому не знает, выполнено ли оно, — и на всякий случай ничего не делает. Причины:
- «Поле «…» не найдено: возможно, модуль, который его добавлял, отключён» — поле добавлял сторонний модуль;
- «Не удалось прочитать поле «…»: …» или «Не удалось проверить условие оператором «…»: …» — ошибка при чтении данных заказа.
Такой пропуск не повторяется: следующее сохранение заказа проверит сценарий заново.
Что делать. Выполните проверку на этом заказе — она покажет, какое условие не удалось проверить и почему. Если поле добавлял сторонний модуль — проверьте, что он установлен и работает. Если ошибка повторяется на стандартных полях — пришлите её текст в поддержку.
Сбой расширения стороннего модуля
Что произошло. После установки, обновления или удаления другого модуля часть сценариев перестала срабатывать, но они остались включены.
Где видно. На странице Логи — «Сбой при подключении расширений стороннего модуля: …» и «Сценарий … пропущен, но не выключен: расширения модуля в этом запросе подключились с ошибкой…».
Почему. Сторонние модули могут добавлять в сценарии свои поля, условия и действия. Если такой модуль подключился с ошибкой, модуль сценариев не знает, пропало что-то из магазина или нет. Поэтому сценарии, которым не хватает полей или действий, пропускаются, но не выключаются, — а автоматическое выключение сценариев на это время приостановлено.
Что делать. Передайте текст ошибки из Логов разработчику того модуля, который в нём указан, или обновите этот модуль. Когда расширение снова подключится без ошибок, сценарии заработают сами.
Сбои базы данных и сервера
Что произошло. Итог Ошибка, у соседних сценариев того же прохода — «Изменения не сохранены: в этом проходе по заказу произошла ошибка».
Почему. Сбой среды: недоступна база данных, таблица заблокирована другим процессом, непредвиденная ошибка PHP в коде модуля или чужого обработчика. Заказ при этом не сохранён — проход откатывается целиком.
Где видно. Журнал прогонов и страница Логи: «Сценарии по заказу … не выполнены, задача будет повторена: …».
Что делать. Обычно ничего: модуль сам повторит задачу — всего до трёх попыток. Если сбой разовый, следующая попытка пройдёт. Если ошибки повторяются на многих заказах, сработает предохранитель — тогда разберитесь с причиной по Журналу действий и Логам.
Заказ не поставлен в очередь
Если сбой случился в момент сохранения заказа, на странице Логи будет запись «Заказ … сохранён, но не поставлен в очередь сценариев: …». Заказ сохранён, но сценарии на нём не сработают до следующего сохранения. Примените сценарий к такому заказу из редактора или запуском по заказам.
Заказ изменён, а в журнале нет строки
Редкий случай: заказ сохранён сценарием, но запись в журнал прогонов не удалась. На странице Логи — «Заказ … сохранён сценариями (…), но журнал прогонов не записан: …». Изменения в заказе на месте; запись о них — только в Логах.