thinkphp 无内置定时调度器,必须依赖 linux cron 每分钟调用 php think schedule:run 执行一次任务扫描;命令需在 app/command.php 中完整注册命名空间路径,且 cron 调用须用绝对路径并确保工作目录与权限正确。

ThinkPHP 本身不提供内置的、可独立运行的定时任务调度器,所有“定时”能力都依赖外部触发——要么靠 Linux cron 主动调用命令行,要么靠用户访问触发模拟检查。想让它真正在后台自动跑起来,必须配对操作系统级调度器,否则就是空转。
为什么 php think schedule:run 没反应
TP8 的 schedule:run 命令不是守护进程,它只做一次扫描:查哪些任务该执行、执行它们、退出。它不会自己守着时间等下一秒。
- 必须由
cron每分钟调一次,例如:*/1 * * * * cd /var/www/myapp && /usr/bin/php think schedule:run >> /dev/null 2>&1 - 确认
app/config/console.php中已开启'scheduling' => true - 开发环境默认跳过(
APP_ENV !== 'production'),临时测试可加APP_ENV=production php think schedule:run -v - 任务类必须放在
app/Console/Commands/下,且继承think\console\Command,configure()中设了setName()
php think your:command 执行报 “Command not defined”
这不是命令写错了,是没注册进框架的命令系统里。
-
app/command.php必须存在,且返回一个数组,哪怕为空:return []; - 每个命令类路径要完整注册,例如:
return ['app\command\SyncOrderStatus'];,不能写别名或省略命名空间 - 类文件路径需严格匹配命名空间:类
app\command\SyncOrderStatus必须在app/command/SyncOrderStatus.php - TP6+ 不再支持自动扫描
app/command/目录,漏注册就等于不存在
Linux cron 调用失败的常见原因
90% 的问题出在环境隔离上:cron 运行时几乎不加载你的 shell 配置,PATH 极短,工作目录是 /root,.env 文件也读不到。
- 所有路径必须用绝对路径:
/usr/bin/php(用which php确认)、/var/www/myapp/think、日志路径也要绝对 - 加
cd /var/www/myapp &&确保工作目录正确,否则自动加载失败、配置读不到 - 权限问题:确保运行 cron 的用户(如
www-data或root)对runtime/、.env、命令文件都有读写权限 - 测试时先写最简命令:
* * * * * cd /var/www/myapp && /usr/bin/php think test:ping >> /tmp/cron-test.log 2>&1,等一分钟看日志输出
真正容易被忽略的是:TP 的定时任务从来不是“框架功能”,而是“你把业务逻辑封装成命令 + 操作系统按时敲门”的协作结果。任何试图绕过 cron、用 sleep 循环或第三方插件常驻的做法,在生产环境都极难稳定——尤其是当服务器重启、部署更新或内存溢出时,没人帮你拉起来。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











