ThinkPHP6需借助外部调度机制实现每周执行一次任务,核心是创建命令类并配置Crontab:1. 在app/command/下创建WeeklyReport命令类封装业务逻辑;2. 用crontab -e添加0 2 0定时触发php think report:weekly;3. 可选内置行为模拟或扩展包,但Crontab最稳定精准。

ThinkPHP6 本身不内置定时调度器,要实现“每周执行一次”,必须借助外部调度机制(如 Linux Crontab)触发框架内的命令行任务。核心思路是:写一个命令类封装业务逻辑,再用 Cron 表达式控制执行频率。
1. 创建命令行任务类
在 app/command/ 目录下创建新命令,例如 WeeklyReport.php:
<?php namespace app\command;
use think\console\Command;
use think\console\Input;
use think\console\Output;
class WeeklyReport extends Command
{
protected function configure()
{
$this->setName('report:weekly')
->setDescription('生成并发送周报');
}
protected function execute(Input $input, Output $output)
{
// 这里写你的周报逻辑,比如:
// - 查询上周数据
// - 生成 PDF 或 Excel
// - 发送邮件或企业微信通知
$output->writeln('✅ 周报任务已执行');
}
}
保存后,命令 php think report:weekly 就可在终端手动运行测试。
2. 配置 Crontab 实现每周执行一次
登录服务器,执行:
crontab -e
添加一行(以每周日凌晨 2 点执行为例):
0 2 * * 0 cd /var/www/myproject && /usr/bin/php think report:weekly >> /var/log/weekly-report.log 2>&1
0 2 * * 0是标准 Cron 表达式:分 时 日 月 周→ 第 5 位0表示周日(也可用7,部分系统支持),1是周一,依此类推。
若需每周一凌晨 2 点,则写0 2 * * 1。-
/usr/bin/php建议用绝对路径(可用which php查看); cd /var/www/myproject确保在项目根目录下运行,避免路径或配置加载失败;日志重定向
>> /var/log/...方便排查问题。
3. 其他可选方式补充说明
-
不依赖服务器权限?
可用内置行为模拟 Cron(需有稳定访问流量):在app/config/crons.php中配置return [ 'weekly_job' => [\app\job\WeeklyReportJob::class, 604800] // 7 天 = 604800 秒 ];但该方式靠用户访问触发,无法精准到某天某时,仅适合低精度场景。
-
想更灵活管理?
安装扩展包top-think/think-crontab,把任务注册进config/crontab.php:return [ 'tasks' => [ ['task' => \app\task\WeeklyReport::class, 'expression' => '0 2 * * 0'] ] ];然后统一用
php think crontab:run启动,仍需 Crontab 每分钟调用一次这个主命令。
不需要复杂轮子,也不必改框架源码。写好命令 + 配对 Cron 表达式,就是最稳、最可控的做法。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











