ThinkPHP 8 定时任务需三步打通:命令写对(app/command/下、命名空间app\command、setName注册)、调度器启用(config/console.php中'scheduling' => true)、外部cron触发(每分钟调用php think schedule:run)。

ThinkPHP 8 的定时任务不是“开箱即用”的后台服务,而是一套需要手动配对的协作机制:你写命令 + 框架注册 + 系统 cron 触发。它本身不运行守护进程,也不自动轮询时间。想让它准时干活,关键在三步打通——命令写对、调度器启用、外部触发到位。
确认并启用调度器配置
框架默认不开启定时任务扫描功能,必须显式打开开关。打开 config/console.php 文件,检查是否存在以下配置项:
- 'scheduling' => true —— 这是硬性要求,TP8.0+ 版本强制开启,缺了就完全不走调度逻辑
- 确保该配置在数组顶层,不要嵌套在其他键下;若使用环境配置分离(如 console.production.php),也要同步检查对应环境文件
创建并注册可调度的命令类
能被 schedule:run 扫描到的命令,必须满足四个刚性条件:
- 文件放在 app/command/ 目录下(注意全小写,不是 Console/Commands)
- 命名空间严格为 app\command,类名与文件名完全一致(如
SendEmail.php→app\command\SendEmail) - 在
configure()方法中调用$this->setName('email:send'),名称不含空格或特殊字符 - 在 app/command.php 中完整注册路径:
return ['app\command\SendEmail'];(空数组也必须写return [];)
验证命令是否就绪
别急着配 cron,先本地确认命令已加载成功:
- 执行
php think list,查看输出中是否列出你的命令(如email:send) - 手动运行测试:
php think email:send,确认业务逻辑能正常执行 - 再试调度扫描:
APP_ENV=production php think schedule:run -v(加-v看详细日志,APP_ENV=production模拟生产环境)
配置系统级 cron 触发器
ThinkPHP 不自己守时,必须靠服务器 cron 每分钟敲一次门:
- 编辑 crontab:
crontab -e - 添加一行(路径请按实际替换):
*/1 * * * * cd /var/www/myapp && /usr/bin/php think schedule:run >> /dev/null 2>&1 - 务必用绝对路径:
/usr/bin/php(查路径用which php),cd切到项目根目录,否则加载失败 - 权限要通:运行 cron 的用户(如 www-data)需对
runtime/、.env、命令文件有读写权限
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











