
Установка и настройка запуска
Scheduler ставится из репозитория modstore.pro или modmore.com, либо собирается из исходников — modx-pro/Scheduler. После установки остаётся один обязательный шаг — запись в cron: именно она запускает отложенные задания.
Требования: MODX 2 или MODX 3, PHP 7.4 или новее.
Установка пакета
- Подключите репозиторий: modstore.pro или modmore.com — для второго есть отдельная инструкция.
- Откройте установщик пакетов, выберите подключённого поставщика, найдите Scheduler и установите.
Долгое время у компонента было две линии развития: оригинал modmore и форк с правками для MODX 3. Версия 1.9.0 их объединила, сборку на modstore.pro ведёт modx-pro/Scheduler.
Запись в cron
Запускать нужно всегда один и тот же файл, а способ прописать запись зависит от сервера:
php /home/server/user/path/to/assets/components/scheduler/run.phpВместо php подставьте ту версию, под которой работает сайт: на хостингах это обычно отдельные команды вида php8.2 или полный путь к интерпретатору.
Пример записи для ежеминутного выполнения — пять полей расписания, затем команда:
* * * * * php8.2 ~/www/assets/components/scheduler/run.phpЧастота запуска
- Несколько заданий в неделю — достаточно раза в 5 минут.
- Фоновая отправка писем или обработка данных почти в реальном времени — раз в минуту.
Чаще раза в минуту cron не запускает. Чтобы не ждать следующего прохода, вызовите run.php вручную — см. Запуск по HTTP.
Один проход забирает запуски, у которых время уже наступило, и берёт их не больше, чем указано в scheduler.tasks_per_run — по умолчанию один. Если очередь пуста, проход ничего не делает: вызов run.php не запускает задание, время которого ещё не пришло.
Долгие задания — те, что выполняются дольше интервала между проходами, — лучше разводить по более частым проходам, а не по числу запусков за проход. Одновременные проходы друг другу не мешают: запуск захватывается атомарно, и проход, которому он не достался, просто берёт следующий.
Задания из cron выполняются в контексте mgr: run.php подключает коннектор ядра, а тот без параметра ctx поднимает именно его. Переключать контекст Scheduler не умеет, поэтому заданию, которому нужны ссылки и ресурсы сайта, придётся вызвать $modx->switchContext('web') самому.
Системные настройки
Настройки лежат в системных настройках MODX, пространство имён scheduler.
| Настройка | По умолчанию | Описание |
|---|---|---|
scheduler.tasks_per_run | 1 | Сколько запусков берёт один проход cron |
scheduler.recurring_on_failure | выключено | Планировать следующий запуск циклического задания и после неудачного. Пока выключено, цикл останавливается на первой ошибке — но повторные попытки отрабатывают независимо от этой настройки |
scheduler.delete_tasks_after | пусто | Удалять завершённые запуски старше указанного срока. Строка для strtotime(), например -1 year. Пусто — ничего не удаляется |
scheduler.email_failure | пусто | Адреса для писем о сбоях, через запятую. Пусто — письма не отправляются |
scheduler.email_failure_subject | пусто | Тема письма. Пусто — встроенная: Error running <namespace> :: <reference> |
scheduler.email_failure_tpl | пусто | Имя чанка для тела письма. Пусто — встроенный шаблон |
Очистка истории выполняется не каждый проход: run.php берётся за неё, когда минута запуска делится на 30. Из этого следует, что при расписании, которое не попадает на нулевую и тридцатую минуту (раз в 7 минут, раз в час в :15), очистка не выполнится никогда. Удаляются и успешные запуски, и завершившиеся с ошибкой.
Письмо уходит как HTML, отправителем подставляется системный emailsender. В теме и в чанке доступны плейсхолдеры:
| Плейсхолдер | Что внутри |
|---|---|
task_namespace, task_reference | Пространство имён и название задания — то же, что в его полях |
task_description | Описание задания |
run_id | Идентификатор упавшего запуска |
run_message | Значение, которое вернуло задание |
run_errors | Массив записей об ошибках, как он лежит в запуске |
run_errors_formatted | Тот же массив, прогнанный через print_r() — готовая строка для письма |
run_retry_count | Номер повторной попытки; 0 — это первый запуск |
site_name, site_url | Системные настройки сайта |
executed_on | Время запуска в формате Y-m-d H:i:s |
Встроенный шаблон отдельным чанком не лежит — письмо собирается в коде задания, поэтому свой чанк проще писать с нуля, опираясь на таблицу выше.
Запуск по HTTP
https://yoursite.com/assets/components/scheduler/run.php?ctx=webАдрес нужен, когда задание надо выполнить немедленно, не дожидаясь прохода cron, или когда запуск инициирует внешний сервис.
Параметр ctx задаёт контекст, в котором поднимается MODX: run.php подключает коннектор ядра, а тот без параметра инициализирует контекст mgr. Для заданий, которые работают с ресурсами и ссылками сайта, нужен ctx=web.
Адрес ничем не защищён: ни ключа, ни проверки прав у run.php нет. Любой, кто его знает, может инициировать проход. Выполнить он сможет только то, что уже стоит в очереди, но нагрузку создать получится — если это нежелательно, закройте адрес на уровне веб-сервера.
Постоянно запускать планировщик по HTTP не стоит
Запрос обрабатывает веб-сервер, а у него почти всегда стоят ограничения на память и время выполнения — долгое или тяжёлое задание упадёт. На запуск по cron эти ограничения не действуют.
