Перейти к основному содержимому

Фоновая обработка и защиты модуля

Сценарии выполняются не в момент сохранения заказа, а чуть позже — в фоне, через очередь. Так сохранение заказа в админке или в корзине не замедляется, а сбой сценария не мешает покупателю оформить заказ. На этой странице — что может задержать или остановить фоновую обработку и как это заметить.

Как заказ попадает к сценариям​

  1. Заказ сохранён — модуль ставит задачу в очередь. Если активных сценариев для сайта заказа нет, задача не ставится вовсе.
  2. Задача выполняется сразу после ответа браузеру — в конце того же запроса. Это настройка «Запуск очереди сразу после ответа», по умолчанию включена.
  3. Если задача не выполнилась сразу, её подберёт агент очереди — он запускается раз в минуту.

Сценарии по расписанию работают иначе: отдельный агент раз в заданный интервал (по умолчанию — 60 минут) выбирает заказы и ставит их в ту же очередь, не больше заданного числа заказов за проход. Параметры — в настройках расписания.

Заказ ждёт в очереди​

Что произошло. Проверка на заказе говорит «Сработает», а в журнале прогонов строки нет — или она появилась заметно позже сохранения.

Где видно. Окно Агент очереди (кнопка Настройки над списком сценариев → справа вверху): состояние агента и сколько задач ждёт в очереди.

Почему и что делать:

  • Агенты Битрикса работают на хитах. Тогда агент очереди запускается, только когда кто-то заходит на сайт, — ночью и на сайте с малой посещаемостью задачи могут ждать долго. Переведите агенты на cron — см. Настройка агентов на cron.
  • Выключен запуск сразу после ответа. Тогда очередь разбирает только агент, и задержка составит минуту-две даже при работающем cron.
  • В очереди много задач. Когда в очереди больше 50 ждущих задач (например, после массового запуска или выгрузки заказов из учётной системы) новые задачи не выполняются сразу, а ждут агента. Агент разбирает задачи порциями — дождитесь, пока очередь опустеет.
  • Агент остановлен вручную кнопкой Остановить агента. Задачи копятся в очереди и будут выполнены после Перезапустить агента.
  • Агент не установлен. Модуль восстанавливает агента сам при следующем сохранении заказа. Если состояние не меняется — нажмите Перезапустить агента.

Несколько сохранений подряд — один прогон​

Если заказ сохранили несколько раз подряд, пока его задача ещё ждала в очереди, модуль не ставит новую задачу на каждое сохранение, а пользуется уже стоящей. Сценарии отработают один раз — на итоговом состоянии заказа, и в журнале будет одна строка. Условия на изменение («изменилось», «было», «стало») в таком прогоне сравнивают состояние до первого из этих сохранений с итоговым.

Агент остановлен предохранителем​

Что произошло. Сценарии перестали срабатывать на всех заказах, хотя они активны и модуль включён.

Где видно:

  • в окне Агент очереди — состояние «остановлен предохранителем», а очередь растёт;
  • на странице Журнал действий (группа Диагностика) — запись об остановке очереди со списком самых частых ошибок за последний час.

Почему. Если за час в очереди накопилось 100 и больше задач, завершившихся ошибкой после всех повторов, модуль останавливает агента очереди. Массовые ошибки почти всегда значат, что сломано что-то общее — база данных, чужой модуль, сервер, — и разбирать очередь дальше значит плодить ошибки и нагружать сайт.

Что делать.

  1. Посмотрите в Журнале действий, какие ошибки были самыми частыми, и устраните причину.
  2. Нажмите Перезапустить агента в окне агента очереди. Если ничего не делать, агент запустится сам при первой новой задаче — например, сохранении заказа — после того, как ошибок за последний час станет меньше порога.

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

Очередь переполнена​

Что произошло. Новые заказы перестали обрабатываться сценариями, а в очереди очень много задач.

Где видно. На странице Журнал действий — предупреждение «В очереди сценариев … ждущих задач при потолке 20000: новые задачи не ставятся. Проверьте, что агенты и крон работают». Пишется не чаще раза в час.

Почему. Очередь давно не разбирается: агенты не запускаются, cron не работает, агент очереди остановлен. Чтобы таблица очереди не росла бесконечно, при 20 000 ждущих задач модуль перестаёт ставить новые.

Что делать.

  1. Проверьте, что агенты Битрикса и cron работают, и что агент очереди в состоянии «работает».
  2. Дождитесь, пока очередь разберётся.
  3. Заказы, сохранённые, пока очередь была переполнена, в очередь не попали — обработайте их запуском по заказам с фильтром по периоду.

Массовый запуск обработал не все заказы​

Запуск по заказам ставит в очередь не больше 1000 заказов за раз — первые по возрастанию ID. Если под фильтр подпадает больше, модуль предупредит об этом при проверке охвата; остальные запустите отдельно, сузив фильтр.

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

  • «Очередь сценариев переполнена (задач в ожидании: …) — запустите позже» — запуск отклонён целиком, см. Очередь переполнена;
  • очередь заполнилась или сбоила во время досылки — на странице Логи запись «Ошибка массового запуска сценария …» с числом заказов, которые не попали в очередь. Дождитесь, пока очередь разберётся, и запустите сценарий ещё раз на оставшиеся заказы.

Сработала защита от петель​

Что произошло. В журнале прогонов итог Пропущен с текстом «Изменения не сохранены: сработала защита от зацикливания».

Где видно. Журнал прогонов по номеру заказа — видно, как сценарии раз за разом меняли один и тот же заказ. На странице Логи — запись «Сценарии сохранили заказ … уже 5 раз за 10 мин — похоже на зацикливание, сохранение остановлено. Сценарии по порядку: #3 -> #7 -> #3 -> …».

Почему. Сценарии сохранили один заказ больше раз, чем разрешено пределом сохранений (по умолчанию — 5 за 10 минут). Типичные причины:

  • два сценария «перетягивают» заказ: один ставит значение, другой возвращает обратно;
  • сценарий меняет заказ, а обработчик другого модуля или обмен с учётной системой возвращает прежнее значение, и сценарий срабатывает снова.

Что делать. По цепочке в Логах найдите сценарии, которые спорят, и добавьте им условия, чтобы правила не противоречили друг другу. Повышайте предел, только если несколько сценариев законно меняют один заказ много раз подряд.

Условие не удалось проверить​

Что произошло. Итог Пропущен с текстом «Условие … не удалось проверить, действия не применялись: …».

Почему. Модуль не смог узнать значение для условия, поэтому не знает, выполнено ли оно, — и на всякий случай ничего не делает. Причины:

  • «Поле «…» не найдено: возможно, модуль, который его добавлял, отключён» — поле добавлял сторонний модуль;
  • «Не удалось прочитать поле «…»: …» или «Не удалось проверить условие оператором «…»: …» — ошибка при чтении данных заказа.

Такой пропуск не повторяется: следующее сохранение заказа проверит сценарий заново.

Что делать. Выполните проверку на этом заказе — она покажет, какое условие не удалось проверить и почему. Если поле добавлял сторонний модуль — проверьте, что он установлен и работает. Если ошибка повторяется на стандартных полях — пришлите её текст в поддержку.

Сбой расширения стороннего модуля​

Что произошло. После установки, обновления или удаления другого модуля часть сценариев перестала срабатывать, но они остались включены.

Где видно. На странице Логи — «Сбой при подключении расширений стороннего модуля: …» и «Сценарий … пропущен, но не выключен: расширения модуля в этом запросе подключились с ошибкой…».

Почему. Сторонние модули могут добавлять в сценарии свои поля, условия и действия. Если такой модуль подключился с ошибкой, модуль сценариев не знает, пропало что-то из магазина или нет. Поэтому сценарии, которым не хватает полей или действий, пропускаются, но не выключаются, — а автоматическое выключение сценариев на это время приостановлено.

Что делать. Передайте текст ошибки из Логов разработчику того модуля, который в нём указан, или обновите этот модуль. Когда расширение снова подключится без ошибок, сценарии заработают сами.

Сбои базы данных и сервера​

Что произошло. Итог Ошибка, у соседних сценариев того же прохода — «Изменения не сохранены: в этом проходе по заказу произошла ошибка».

Почему. Сбой среды: недоступна база данных, таблица заблокирована другим процессом, непредвиденная ошибка PHP в коде модуля или чужого обработчика. Заказ при этом не сохранён — проход откатывается целиком.

Где видно. Журнал прогонов и страница Логи: «Сценарии по заказу … не выполнены, задача будет повторена: …».

Что делать. Обычно ничего: модуль сам повторит задачу — всего до трёх попыток. Если сбой разовый, следующая попытка пройдёт. Если ошибки повторяются на многих заказах, сработает предохранитель — тогда разберитесь с причиной по Журналу действий и Логам.

Заказ не поставлен в очередь​

Если сбой случился в момент сохранения заказа, на странице Логи будет запись «Заказ … сохранён, но не поставлен в очередь сценариев: …». Заказ сохранён, но сценарии на нём не сработают до следующего сохранения. Примените сценарий к такому заказу из редактора или запуском по заказам.

Заказ изменён, а в журнале нет строки​

Редкий случай: заказ сохранён сценарием, но запись в журнал прогонов не удалась. На странице Логи — «Заказ … сохранён сценариями (…), но журнал прогонов не записан: …». Изменения в заказе на месте; запись о них — только в Логах.