Команда schedule
Задачи по расписанию не перечислены в одном файле — они разбросаны атрибутами
#[Scheduled] по коду. Команда schedule собирает их в
таблицу, показывает расписание каждой и управляет самим планировщиком.
Что запланировано
Действие по умолчанию — именно список, поэтому команду можно вызвать без аргументов:
php call schedule
php call schedule list | [================================ 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 сканирует проект, а не спрашивает работающий процесс. Поэтому он работает
всегда — и годится, чтобы проверить расписание перед выкладкой или убедиться, что
новая задача вообще подхватилась.
Запуск планировщика
php call schedule start # в терминале
php call schedule start -d # в фоне
php call schedule stop # корректная остановкаПланировщик — один долгоживущий процесс, который следит за временем и запускает задачи по мере наступления сроков. Сами задачи он выполняет отдельно, поэтому долгая задача не сдвигает расписание остальных.
Планировщик один на хост
Второй запуск не создаст второй планировщик: класс защищён блокировкой, как и любой процесс-одиночка. Это защита от двойного срабатывания — иначе после неудачной выкладки или перезапуска задачи выполнялись бы по два раза.
Из этого же следует, что на нескольких серверах планировщик должен работать на одном. Приложение можно масштабировать, планировщик — нет.
Обычно отдельно его не запускают: атрибут #[EnableScheduler] на классе приложения
поднимает планировщик вместе с call run. Отдельный запуск нужен, когда планировщик
живёт своим процессом — в своём контейнере или под супервизором.
Состояние
php call schedule status | [================================ 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 — планировщик
ждёт следующего срока; это нормальное состояние почти всё время.
Если планировщик остановлен, команда скажет прямо:
| [ 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 — запуск планировщика вместе с приложением