Перейти к содержанию

Задания и cron

Всё, что отправляет Mailroom, — задание в его очереди: кампания — одно задание, письмо подтверждения — одно задание, как и каждый шаг автоматизации, импорт и пересчёт сегмента. Задания выполняют две вещи: разгрузка после запроса и обработчик, который планировщик Grav запускает каждую минуту.

Настройка cron

Обработчик — bin/plugin mailroom work. Mailroom добавляет его в планировщик Grav как mailroom-worker каждую минуту, поэтому сделать нужно одно: поместить планировщик Grav в crontab пользователя, от которого работает сайт:

PATH=/usr/local/bin:/usr/bin:/bin
* * * * * cd /path/to/site && php bin/grav scheduler >> /dev/null 2>&1

Укажите в строке PATH папку, в которой лежит ваш бинарный файл PHP. На macOS с Homebrew, например, это что-то вроде /opt/homebrew/opt/php@8.4/bin. bin/plugin mailroom status печатает точную строку планировщика для вашего сайта, когда обработчик не запущен, построенную Grav так же, как её строит bin/grav scheduler --install.

Важно

Строка PATH не необязательна. bin/plugin начинается с #!/usr/bin/env php, а планировщик запускает его дочерним процессом, который наследует минимальный PATH cron. Абсолютный путь к PHP в строке crontab исправляет родителя, а не ребёнка, поэтому планировщик выглядит здоровым, пока обработчик падает с env: php: No such file or directory. Запустите bin/grav scheduler -d, чтобы напечатать ошибки каждого задания.

Чтобы запускать обработчик иначе (супервизор, собственная строка cron), выключите Run From Grav's Scheduler (worker.scheduler) на вкладке Advanced и запускайте bin/plugin mailroom work каждую минуту сами.

Что делает проход обработчика

  1. Ставит в очередь периодическую работу, которой пришло время: запуск автоматизаций (движение людей по их автоматизациям) и пересчёт сегментов.
  2. Отпускает письма, ждавшие адреса сайта, как только он задан (ниже).
  3. Выполняет готовые задания до 50 секунд (--max-time), без ограничения на их число (--max-jobs, 0).
  4. Раз в день выполняет уборку.
  5. Записывает, когда запускался, что читают status, экран Health и вкладка Sending.

Обработчик отказывается работать, пока ждут миграции базы данных.

Разгрузка после запроса

Когда веб-запрос ставит задания в очередь, например письмо подтверждения после подписки, Mailroom выполняет эти задания, и только их, сразу после отправки ответа, в пределах Seconds After a Request (worker.inline_budget_seconds, 3, не более 30). Поэтому подписка подтверждается сразу, даже до настройки cron, и чей-то щелчок не платит за чужой завал.

На PHP-FPM ответ уже у браузера, когда разгрузка начинается. На сервере без FastCGI процесс PHP остаётся занят на время разгрузки, поэтому бюджет мал. Выключите Send Right After the Request (worker.inline_drain), если работа после ответа создаёт проблемы на вашем хостинге; тогда обработчик берёт каждое задание.

Примечание

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

Повторные попытки и ошибки

Задание, которое упало, пробуется снова с растущим ожиданием (минута после первой ошибки, две после второй, никогда больше часа) до своих попыток. После этого оно остаётся неудачным с последней ошибкой. Задание, работающее дольше Longest One Job May Run (worker.job_timeout_seconds, 120), останавливается и пробуется позже; 0 выключает ограничение.

bin/plugin mailroom status считает неудачные задания, а экраны кампании и импорта говорят, почему их задания упали. Для кампании Retry failed снова отправляет неудачные сообщения (см. Кампании).

Письма, удерживаемые из-за адреса сайта

Письму, которое строит обработчик, нужен адрес сайта для ссылок. Если не заданы ни Site URL Mailroom, ни Custom Base URL Grav, такое задание возвращается в очередь на пять минут, не тратя попытку, сколько бы раз это ни требовалось, и одна строка в журнале Grav говорит почему. Как только адрес задан, следующий запуск обработчика отправляет всё, что ждало. См. Устранение неполадок.

Уборка

Раз в день обработчик удаляет:

Что Через Настройка
Завершённые и неудачные задания 30 дней worker.retain_days
Отдельные переходы и события провайдера 365 дней tracking.retain_days
Загруженные файлы импорта, чей импорт так и не запускался 30 дней import.keep_days
Строки журнала сообщений 180 дней mail_log.retain_days

bin/plugin mailroom work печатает, что уборка удалила, в том запуске, когда это происходит.

Работает ли обработчик?

  • bin/plugin mailroom status показывает Jobs waiting, Jobs failed и Worker last ran. Она перестаёт называть сайт здоровым, когда обработчик не запускался больше 15 минут или не запускался никогда, даже если ничего не ждёт, и печатает строку crontab, которую нужно добавить.
  • Проверка The queue worker на экране Health предупреждает, когда обработчик не запускался 15 минут, пока ждут задания.
  • Карточка The queue worker на вкладке Sending говорит, когда он запускался последний раз.

Типы заданий

Задание Что делает
newsletter.send_campaign Отправляет одну порцию кампании (sending.batch человек), затем возвращает управление обработчику
newsletter.confirmation Отправляет письмо подтверждения
newsletter.send_flow_email Отправляет одно письмо автоматизации одному человеку
newsletter.flow_tick Двигает людей по их автоматизациям
newsletter.segment_counts Пересчитывает устаревшие сегменты
newsletter.import Выполняет импорт CSV из админки или API

Настройки

На вкладке Advanced:

Ключ Название По умолчанию Что делает
worker.scheduler Run From Grav's Scheduler Включено Выключено — планировщик не трогает Mailroom, для сайта, который запускает обработчик иначе.
worker.inline_drain Send Right After the Request Включено Выполнять задания, поставленные запросом, после его ответа.
worker.inline_budget_seconds Seconds After a Request 3 Сколько может длиться эта разгрузка (от 1 до 30).
worker.job_timeout_seconds Longest One Job May Run (seconds) 120 Задание дольше этого останавливается и пробуется позже. 0 выключает ограничение.
worker.retain_days Keep Finished Jobs For (days) 30 Завершённые и неудачные задания убираются раз в день через столько дней.
mail_log.retain_days Keep the Message Log For (days) 180 Строки журнала сообщений старше этого убираются раз в день. 0 хранит их.