ThinkPHP 8 定时任务需封装为命令类,存放于 app/command/ 目录,命名空间为 app\command,继承 think\console\Command;须在 app/command.php 中手动注册命令数组。

创建可执行的定时任务命令类
ThinkPHP 8 不自带常驻调度器,所有定时逻辑必须先封装成命令行指令。这类指令统一放在 app/command/ 目录下,文件名与类名严格一致,命名空间固定为 app\command。
例如清理缓存任务,新建 app/command/CleanCache.php:
- 声明命名空间
app\command,继承think\console\Command - 在
configure()中调用$this->setName('cron:clean-cache')和->setDescription(...) -
execute()方法里写真实业务,比如\think\Cache::clear(),并用$output->writeln()输出日志
显式注册命令到框架
TP8 不会自动扫描 app/command/,必须手动注册。确保项目中存在 app/command.php 文件,内容为返回数组:
- 哪怕只有一个命令,也必须写成:
<?php return ['app\command\CleanCache']; - 多个命令就追加字符串,如
['app\command\CleanCache', 'app\command\BackupDb'] - 空文件也要写
return [];,否则框架启动报错 - 类名、命名空间、路径三者必须完全匹配,大小写敏感
配置 Linux crontab 触发调度
TP8 的 php think schedule:run 只做一次扫描,不守时,必须靠系统级 cron 每分钟调用一次:
立即学习“PHP免费学习笔记(深入)”;
- 编辑任务:
crontab -e - 添加标准行(注意全部用绝对路径):
*/1 * * * * cd /var/www/myapp && /usr/bin/php think schedule:run >> /dev/null 2>&1 - 确认
/usr/bin/php是真实 PHP 路径(用which php查) - 确认
config/console.php中已设'scheduling' => true - 生产环境默认只运行,开发测试需临时加
APP_ENV=production
数据库备份与恢复的命令实现
把备份还原逻辑也做成命令,和定时任务统一管理:
- 新建 app/command/BackupDb.php,在
execute()中调用系统mysqldump命令,生成带时间戳的 SQL 文件,存到runtime/backup/ - 再建一个 app/command/RestoreDb.php,读取指定 SQL 文件,用
mysql命令导入 - 两个命令都按规范注册进
app/command.php - 可在 crontab 中单独调用备份命令,如每天凌晨 2 点:
0 2 * * * cd /var/www/myapp && /usr/bin/php think db:backup >> /var/log/db-backup.log 2>&1
验证与日志排查要点
部署后务必逐项验证,多数失败源于路径或环境隔离:
- 本地先跑:
php think list看命令是否列出;php think cron:clean-cache看能否执行成功 - crontab 日志重定向到具体文件,比如
>> /var/log/think-cron.log 2>&1,方便查错 - cron 不加载 shell 配置,PATH 极短,所有二进制路径(php、mysqldump、mysql)必须写绝对路径
- 确保运行 cron 的用户(如 www-data)对
runtime/、.env、备份目录有读写权限



















