ThinkPHP 8.1可通过自定义命令类实现定时任务,需将命令类置于app/command/目录,命名空间为app\command,类名与文件名一致,如CleanCache.php对应app\command\CleanCache类。

你需要让ThinkPHP 8.1项目在服务器上每天自动执行清理缓存、同步数据或推送消息等后台逻辑,不靠用户访问触发,也不依赖手动运行命令,而是真正按设定时间准时启动。
创建可执行的命令类
命令类必须放在app/command/目录下,文件名与类名严格一致,命名空间必须是app\command。
新建文件app/command/CleanCache.php,内容如下:
```php
namespace app\command;
use think\console\Command;
use think\console\Input;
use think\console\Output;
class CleanCache extends Command
{
protected function configure(): void
{
$this->setName('cron:clean-cache')
->setDescription('清理运行时缓存');
}
protected function execute(Input $input, Output $output): int
{
\think\Cache::clear();
$output->writeln('缓存已清空');
return self::SUCCESS;
}
}
```
立即学习“PHP免费学习笔记(深入)”;
这一步不能省略命名空间声明,也不能把类放到app/Console/Commands/——TP8.1默认不扫描该路径,【必须用app/command/】。
注册命令到框架
ThinkPHP不会自动加载app/command/下的类,必须显式注册。
打开或新建app/command.php文件,确保它返回一个数组:
<?php return ['app\command\CleanCache'];
多个命令就追加字符串,例如:['app\command\CleanCache', 'app\command\SyncOrderStatus']。
注意:空数组也得写return [];,否则框架启动时报错;漏写命名空间或写错大小写都会导致php think list里看不到命令。
本地测试命令是否生效
在项目根目录执行以下两步验证,跳过则线上90%会失败:
第一步:运行php think list,确认输出中包含cron:clean-cache这一行。
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
第二步:直接执行php think cron:clean-cache,观察终端是否打印“缓存已清空”,并检查runtime/cache/目录是否变为空。
如果报Class not found,立刻检查三处:文件路径是否为app/command/CleanCache.php、类名是否为CleanCache、app/command.php里注册的字符串是否为'app\command\CleanCache'。
配置Linux crontab定时触发
这才是让任务真正“定时”的环节。crontab不读你的.bashrc,PATH极短,工作目录默认是/root,所有路径必须绝对化。
方法一:手动添加标准任务
① 用which php查出PHP解释器真实路径,常见为/usr/bin/php或/opt/php/bin/php。
② 用crontab -e编辑任务列表,添加一行(示例为每天凌晨3点执行):
0 3 * * * cd /var/www/myproject && /usr/bin/php think cron:clean-cache >> /var/log/clean-cache.log 2>&1
③ 【cd /var/www/myproject必须写在前面】,否则框架无法加载配置、读不到.env、自动加载失效。
方法二:使用schedule:run集中调度(需额外配置)
先确认app/config/console.php中'scheduling' => true已开启;
再确保命令类继承think\console\Command且调用了$this->setName();
最后在crontab中每分钟执行一次扫描:*/1 * * * * cd /var/www/myproject && /usr/bin/php think schedule:run >> /dev/null 2>&1。
注意:TP8.1默认只在APP_ENV=production下运行调度,开发环境测试需临时加APP_ENV=production前缀。


















