ThinkPHP6需借助外部机制实现每周定时任务,推荐使用Linux Crontab,如“0 2 0”表示每周日凌晨2点执行;也可用think-crontab扩展集中管理,或HTTP触发应急。

ThinkPHP6 本身不内置“每周执行一次”的调度引擎,必须借助外部机制或扩展来实现。核心思路是:把业务逻辑封装成命令行指令,再用系统级定时器(如 Linux Crontab)按周触发。
用 Crontab 实现每周固定时间执行
这是最稳定、最常用的方式,适用于有服务器 SSH 权限的生产环境。- Crontab 表达式格式为:
分 时 日 月 周 命令,其中“周”字段取值 0–7(0 和 7 都代表周日) - 比如“每周日凌晨 2 点执行”:
0 2 * * 0 /usr/bin/php /var/www/myproject/think cron:weekly-report >> /var/log/weekly.log 2>&1 - “每周三上午 9 点执行”:
0 9 * * 3 /usr/bin/php /var/www/myproject/think cron:send-newsletter >> /var/log/newsletter.log 2>&1
注意:
- 替换
/usr/bin/php为实际 PHP 路径(可用which php查看) - 确保
think入口文件有执行权限,且项目路径正确 - 日志路径需存在,目录要有写入权限
在项目中定义 weekly-report 命令
先创建一个可被 Crontab 调用的命令类:运行命令生成类:
php think make:command Cron/WeeklyReport-
编辑
app/command/Cron/WeeklyReport.php,确保包含完整逻辑:立即学习“PHP免费学习笔记(深入)”;
protected function configure() { $this->setName('cron:weekly-report') ->setDescription('生成并发送本周运营报告'); } protected function execute(Input $input, Output $output) { // 示例:调用服务类执行报表生成 \app\service\ReportService::generateWeekly(); $output->writeln('✅ 周报任务执行完成'); } 保存后,可在命令行手动测试:
php think cron:weekly-report
用第三方扩展集中管理(如 think-crontab)
适合多任务、需代码内统一维护的场景。安装扩展:
composer require top-think/think-crontab-
在
config/crontab.php中添加任务:return [ 'tasks' => [ [ 'task' => \app\task\WeeklyReport::class, 'expression'=> '0 2 * * 0', // 每周日 2:00 ] ] ]; 启动监听(常驻进程):
php think crontab:run
⚠️ 注意:该方式依赖常驻进程存活,需配合 Supervisor 或 systemd 管理进程生命周期,避免意外退出。
不推荐但可应急的方式:HTTP 触发模拟
仅适用于无服务器权限、但站点有稳定访问量的共享主机。-
在
app/config/crons.php中配置:return [ 'weekly_backup' => [\app\job\WeeklyBackup::class, 604800] // 7天 = 604800秒 ]; 在
app/behavior/CronRun.php中检查并触发(需自行实现钩子逻辑)依赖每次 HTTP 请求时判断是否到周期,不准时、不可靠,仅作临时方案。
不复杂但容易忽略。



















