Skip to content
Scheduler
Scheduler
Планирование отложенных заданий в MODX 2 и MODX 3
  • MODX 2
  • MODX 3
  1. Компоненты
  2. Scheduler
  3. Установка

Установка и настройка запуска ​

Scheduler ставится из репозитория modstore.pro или modmore.com, либо собирается из исходников — modx-pro/Scheduler. После установки остаётся один обязательный шаг — запись в cron: именно она запускает отложенные задания.

Требования: MODX 2 или MODX 3, PHP 7.4 или новее.

Установка пакета ​

  1. Подключите репозиторий: modstore.pro или modmore.com — для второго есть отдельная инструкция.
  2. Откройте установщик пакетов, выберите подключённого поставщика, найдите Scheduler и установите.

Долгое время у компонента было две линии развития: оригинал modmore и форк с правками для MODX 3. Версия 1.9.0 их объединила, сборку на modstore.pro ведёт modx-pro/Scheduler.

Запись в cron ​

Запускать нужно всегда один и тот же файл, а способ прописать запись зависит от сервера:

shell
php /home/server/user/path/to/assets/components/scheduler/run.php

Вместо php подставьте ту версию, под которой работает сайт: на хостингах это обычно отдельные команды вида php8.2 или полный путь к интерпретатору.

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

console
* * * * * 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_run1Сколько запусков берёт один проход 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 ​

text
https://yoursite.com/assets/components/scheduler/run.php?ctx=web

Адрес нужен, когда задание надо выполнить немедленно, не дожидаясь прохода cron, или когда запуск инициирует внешний сервис.

Параметр ctx задаёт контекст, в котором поднимается MODX: run.php подключает коннектор ядра, а тот без параметра инициализирует контекст mgr. Для заданий, которые работают с ресурсами и ссылками сайта, нужен ctx=web.

Адрес ничем не защищён: ни ключа, ни проверки прав у run.php нет. Любой, кто его знает, может инициировать проход. Выполнить он сможет только то, что уже стоит в очереди, но нагрузку создать получится — если это нежелательно, закройте адрес на уровне веб-сервера.

Постоянно запускать планировщик по HTTP не стоит

Запрос обрабатывает веб-сервер, а у него почти всегда стоят ограничения на память и время выполнения — долгое или тяжёлое задание упадёт. На запуск по cron эти ограничения не действуют.