thinkphp 8.0 定时任务需通过自定义命令+系统 crontab 实现:一、在 app/command/ 下创建继承 think\console\command 的类,setname() 设命令名;二、在 app/command.php 中显式注册全类名;三、本地执行 php think list 和 php think xxx 验证;四、crontab 中用绝对路径调用,如 cd /path && /usr/bin/php think cache:clean。

ThinkPHP8.0 本身不提供内置的守护进程式定时调度器,它的定时任务依赖“命令 + 系统级调度”的协作模式。核心思路是:把业务逻辑封装成一个可执行的命令行指令,再由操作系统(如 Linux crontab)按计划调用它。这种方式轻量、稳定、易排查,适合绝大多数项目场景。
一、创建自定义命令类
这是最基础也最关键的一步。命令必须严格符合框架规范,否则 crontab 调用时会提示 Command not defined。
- 文件路径固定为 app/command/YourTaskName.php(注意是小写 command)
- 类名与文件名一致,例如
CleanCache.php→ 类名CleanCache - 命名空间必须是 app\command,不能省略或写错
- 继承
think\console\Command,并在configure()中设置名称:$this->setName('cache:clean') - 业务逻辑写在
execute()方法里,比如\think\Cache::clear();
二、显式注册命令
TP8 不再自动扫描命令目录,必须手动注册才能被识别。
- 确保项目根目录下存在 app/command.php
- 该文件必须返回一个数组,例如:
<?php return ['app\command\CleanCache']; ?> - 多个命令就写成:
['app\command\CleanCache', 'app\command\SyncOrder'] - 空数组也要写
return [];,否则框架启动报错
三、本地测试命令是否生效
跳过这步,线上大概率失败。务必在项目根目录执行:
-
php think list—— 查看输出中是否出现你设的命令名(如cache:clean) -
php think cache:clean—— 直接运行,观察终端输出和实际效果(如缓存是否清空、数据库是否更新) - 若提示未定义,优先检查:命名空间拼写、文件路径大小写、注册数组是否漏反斜杠
四、配置 Linux crontab
cron 运行环境与你的 shell 完全隔离,PATH 极短、不读 .env、默认工作目录是 /root,所以必须用绝对路径。
- 用
which php查 PHP 绝对路径(常见为/usr/bin/php或/opt/remi/php82/root/usr/bin/php) - crontab 条目示例(每5分钟执行一次):
*/5 * * * * cd /var/www/myapp && /usr/bin/php think cache:clean >> /var/www/myapp/runtime/logs/cron-cache.log 2>&1 - 日志路径必须用绝对路径;重定向
2>&1可捕获错误信息,方便排查 - 确保运行 cron 的用户(如 www-data)对项目目录、runtime 和命令文件有读写权限
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











