CLI · Winter Console

Команда schedule

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

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

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

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

bash
php call schedule
php call schedule list
text
 | [================================ Schedule ================================]
| [ Scheduled Tasks ]
|	   TASK                                           TRIGGER
|	   MainTaskDigest::sendDaily                    cron 0 9 * * *
|	   MainTaskCleanup::purgeTemp                   fixedRate 3600s
|	   MainTaskSync::pullRates                      fixedDelay 300s
| - - - - - - - - - - - - - - - - - - - - - - -
| [i] 3 task(s) defined.
| [ Scheduled Tasks ]
| [================================ Schedule ================================]

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

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

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

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

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

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

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

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

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

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

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

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

Состояние

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

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

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

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

Все действия

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

Дальше

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