ThinkPHP 8.0 无内置守护调度器,需通过系统 crontab 每分钟调用 php think schedule:run 触发;必须启用 'scheduling' => true,命令类须置于 app/command/、命名空间为 app\command、继承 think\console\Command、并在 configure() 中设合法命令名;调度注册需与命令名严格一致;本地调试需指定环境变量并加 -v 查看日志。

ThinkPHP 8.0 本身不自带守护式定时调度器,定时执行任务必须靠外部系统触发 + 框架内调度逻辑配合。核心不是“框架自动跑”,而是“你配好规则,让服务器按时拉起命令”。
确保调度器已启用
打开 config/console.php,确认包含这一行:
- 'scheduling' => true —— TP8.0+ 强制要求,缺了就完全不走调度流程
写一个可被调度识别的命令类
必须同时满足以下四点,缺一不可:
- 文件放在 app/command/ 目录下(注意是小写 command,不是 Console/Commands)
- 命名空间为 app\command
- 继承 think\console\Command
- 在 configure() 方法中调用 $this->setName('xxx:yyy')(名称不能含空格、中文或特殊字符)
在 schedule 中注册任务
在 app/command/ScheduleCommand.php(或你自定义的调度入口类)的 schedule() 方法里添加:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
立即学习“PHP免费学习笔记(深入)”;
- $schedule->command('sync:user')->everyMinute();
- 或 $schedule->exec('php think sync:user')->hourly();
注意:这里填的命令名,必须和你在 configure() 中 set 的 name 完全一致。
配置系统级 crontab 触发
TP8 不提供常驻进程,必须依赖 Linux cron 每分钟拉一次:
- 运行 crontab -e
- 添加一行:* * * * * cd /path/to/your/project && php think schedule:run >> /dev/null 2>&1
- 路径务必写绝对路径,cd 切到项目根目录再执行,否则加载失败
开发环境调试技巧
默认只在 APP_ENV=production 下执行调度逻辑。本地测试时可用:
- APP_ENV=local php think schedule:run -v —— 加 -v 查看详细日志,确认是否跳过(如时间未到、环境不匹配、无就绪任务)
- 若仍显示 “No scheduled commands are ready to run”,优先检查 scheduling 配置、命令类路径与命名空间、以及当前时间是否真满足 everyMinute() 等条件


















