ThinkPHP定时任务必须通过系统级Cron调用命令行实现,核心是创建继承think\console\Command的自定义命令类、在configure()中设命令名、execute()中编写业务逻辑,并配置crontab定时执行。

ThinkPHP 中定时任务不是靠框架自带的“定时器”实现的,而是通过系统级的 cron(Linux) 或 任务计划程序(Windows) 调用 ThinkPHP 的命令行指令来执行。核心思路是:把业务逻辑封装成一个自定义命令,再由操作系统定时触发该命令。
1. 创建自定义命令类
在 ThinkPHP 6+ 中,使用 php think make:command 快速生成命令类:
php think make:command CleanLog
生成的类位于 app/command/CleanLog.php,编辑它:
立即学习“PHP免费学习笔记(深入)”;
namespace app\command;
<p>use think\console\Command;
use think\console\Input;
use think\console\Output;
use think\facade\Log;</p><p>class CleanLog extends Command
{
protected function configure()
{
$this->setName('log:clean')
->setDescription('清理30天前的日志文件');
}</p><pre class="brush:php;toolbar:false;">protected function execute(Input $input, Output $output)
{
$logPath = runtime_path('log/');
$files = glob($logPath . '*/*.log');
$cutoff = strtotime('-30 days');
foreach ($files as $file) {
if (filemtime($file) < $cutoff) {
@unlink($file);
}
}
$output->writeln('日志清理完成。');
}}
2. 在命令行中手动测试命令
确保命令能正常运行后再设为定时任务:
- 执行命令:
php think log:clean - 查看输出是否符合预期
- 检查 runtime/log/ 下是否有旧文件被删除
3. 配置系统级定时任务
Linux(推荐使用 crontab):
- 编辑当前用户定时任务:
crontab -e - 添加一行(每天凌晨2点执行):
0 2 * * * /usr/bin/php /var/www/your-project/think log:clean >> /var/log/think-cron.log 2>&1 - 注意替换路径:
/usr/bin/php是 PHP 实际路径(可用which php查看),/var/www/your-project/是项目根目录 - 日志重定向可选,便于排查问题
Windows(使用任务计划程序):
- 打开「任务计划程序」→ 创建基本任务
- 触发器设为「每天」,时间自定义
- 操作设为「启动程序」,程序/脚本填
php.exe路径(如C:\php\php.exe),参数填:C:\your-project\think log:clean,起始于填项目根目录(如C:\your-project\)
4. 注意事项与常见问题
- 命令行执行时,
APP_ENV默认是console,配置可能和 web 不同,建议在config/console.php中统一或按需调整 - 避免在命令中使用
exit或直接输出 HTML/JSON,应使用$output->writeln()输出日志 - 如果命令依赖数据库或缓存,请确认 CLI 环境下的数据库配置正确(尤其是 host,有时 web 用
127.0.0.1,CLI 可能需改localhost或反向) - 权限问题:确保执行命令的用户对 runtime 目录有读写权限(Linux 下常见)



















