Задания и 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 каждую минуту сами.
Что делает проход обработчика¶
- Ставит в очередь периодическую работу, которой пришло время: запуск автоматизаций (движение людей по их автоматизациям) и пересчёт сегментов.
- Отпускает письма, ждавшие адреса сайта, как только он задан (ниже).
- Выполняет готовые задания до 50 секунд (
--max-time), без ограничения на их число (--max-jobs,0). - Раз в день выполняет уборку.
- Записывает, когда запускался, что читают
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 хранит их. |