Files
2026-07-30 11:56:32 +03:00

4.4 KiB
Raw Permalink Blame History

Планировщик

Модуль scheduler собирает фоновые задачи разных модулей в одном месте. Он не требует CLI: панель показывает защищённый HTTP URL, который можно вызывать из планировщика хостинга раз в минуту.

В разделе Модули → Планировщик доступны расписание, включение задачи, ближайший запуск, ручной запуск и журнал. Cron-выражение состоит из пяти частей: минута час день месяц день-недели. Например, */15 * * * * — каждые 15 минут.

Модуль регистрирует задачу фильтром scheduler.tasks:

public static function tasks(array $payload)
{
    $payload['tasks']['my_module.cleanup'] = array(
        'title' => 'Очистка данных',
        'description' => 'Удаляет устаревшие записи.',
        'module' => 'my_module',
        'cron' => '30 3 * * *',
        'timeout' => 120,
        'handler' => array(Cleanup::class, 'run'),
    );
    return $payload;
}

Обработчик получает task, trigger и run_id. Он может вернуть массив с message и метриками. Параллельный запуск одной задачи блокируется. События scheduler.task.started, scheduler.task.completed и scheduler.task.failed позволяют подключить уведомления или собственный аудит.

Длительные задачи

Если работа не помещается в один короткий запрос, не запускайте бесконечный цикл внутри обработчика. Добавьте задаче chunked => true и обрабатывайте за один вызов небольшую порцию:

$payload['tasks']['my_module.rebuild'] = array(
    'title' => 'Перестроение данных',
    'module' => 'my_module',
    'cron' => '20 2 * * 0',
    'enabled' => false,
    'chunked' => true,
    'handler' => array(RebuildTask::class, 'run'),
);

Пошаговый обработчик дополнительно получает state и progress. Верните:

return array(
    'done' => $finished,
    'state' => array('after_id' => $nextId),
    'progress' => array(
        'current' => $processed,
        'total' => $total,
        'label' => 'Документы',
    ),
    'message' => 'Обработано: ' . $processed,
    'result' => array('updated' => $updated),
);

Планировщик сохранит state, освободит блокировку и продолжит задачу при следующем вызове защищённого URL. Запуск остаётся одной строкой журнала, а не создаёт новую строку для каждой порции. Активную работу можно остановить из таблицы задач или журнала. Уже обработанные предметные данные не откатываются; при новом запуске задача начинает собственный сценарий заново.

enabled => false действует только при первом появлении задачи. Такой вариант подходит для тяжёлого обслуживания, которое администратор запускает вручную. Если после ручного старта остались порции, защищённый URL планировщика всё равно продолжит активный запуск, даже когда расписание выключено. Без настроенного HTTP-тика следующую порцию можно запускать кнопкой воспроизведения в таблице.

Событие scheduler.task.progress вызывается после каждой незавершённой порции и передаёт сохранённые state и progress.

После смены секретного URL старый адрес сразу перестаёт работать.