CLI · Winter Console

Команда schedule

Задачи по расписанию не перечислены в одном файле — они разбросаны атрибутами #[Scheduled] по коду. Команда schedule собирает их в таблицу, показывает расписание каждой и управляет самим планировщиком.

Алиас call schПо умолчанию listПланировщик один на хост

Что запланировано

Действие по умолчанию — именно список, поэтому команду можно вызвать без аргументов:

bash
php call schedule
php call sch list           # то же самое
text
[ Scheduled Tasks ]
TASK                                           TRIGGER
MainTaskDigest::sendDaily                    cron 0 9 * * *
MainTaskCleanup::purgeTemp                   fixedRate 3600s
MainTaskSync::pullRates                      fixedDelay 300s
- - - - - - - - - -
[i] 3 task(s) defined.

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

Триггер Что означает
cron 0 9 * * * По календарю — пять полей, без секунд
fixedRate 3600s Каждый час от начала предыдущего запуска
fixedDelay 300s Через пять минут после завершения предыдущего

Разница между двумя последними существенна: fixedRate держит частоту, fixedDelay держит паузу. Подробно — на странице Планировщик.

Список не требует запущенного планировщика

list сканирует проект, а не спрашивает работающий процесс. Поэтому он работает всегда — и годится, чтобы проверить расписание перед выкладкой или убедиться, что новая задача вообще подхватилась.

Запуск планировщика

bash
php call sch start        # в терминале
php call sch start -d     # в фоне
php call sch stop         # корректная остановка

Планировщик — один долгоживущий процесс, который следит за временем и запускает задачи по мере наступления сроков. Сами задачи он выполняет отдельно, поэтому долгая задача не сдвигает расписание остальных.

Планировщик один на хост

Второй запуск не создаст второй планировщик: класс защищён блокировкой, как и любой процесс-одиночка. Это защита от двойного срабатывания — иначе после неудачной выкладки или перезапуска задачи выполнялись бы по два раза.

Из этого же следует, что на нескольких серверах планировщик должен работать на одном. Приложение можно масштабировать, планировщик — нет.

Обычно отдельно его не запускают: атрибут #[EnableScheduler] на классе приложения поднимает планировщик вместе с call run. Отдельный запуск нужен, когда планировщик живёт своим процессом — в своём контейнере или под супервизором.

Состояние

bash
php call sch status
text
[ Scheduler Status ]
Scheduler                  Scheduler ● RUNNING
- - - - - - - - - -
PID          52190
State        RUNNING
Activity     IDLE
Started      2026-08-14 06:40:12
Uptime       7h 55m
Tasks        3

Activity показывает, выполняется ли сейчас какая-то задача. IDLE — планировщик ждёт следующего срока; это нормальное состояние почти всё время.

Если планировщик остановлен, команда скажет прямо:

text
  Scheduler                  ○ STOPPED
[i] The scheduler is not running.

Все действия

Команда Что делает
list Все задачи и их расписание (по умолчанию)
start Запуск в терминале
start -d Запуск в фоне
stop Корректная остановка (SIGTERM)
status Состояние, PID, время работы, число задач

Дальше

  • Планировщик#[Scheduled], cron, fixedRate и fixedDelay
  • process — одиночные процессы
  • daemon — демоны и флоты воркеров
  • run — запуск планировщика вместе с приложением