ThinkPHP6需借助外部机制实现每日定时任务,推荐使用Linux Crontab(每天固定时间执行命令)、think-crontab扩展(集中配置管理)或宝塔面板(可视化设置),并注意时区、路径、权限及防重叠问题。

ThinkPHP6 本身不内置“每天自动执行”的调度服务,必须借助外部机制(如 Linux Crontab)或第三方扩展来实现。核心思路是:把业务逻辑封装成命令行指令,再由系统级计划任务按天触发。
用 Crontab 每天固定时间执行(最常用、最稳定)
这是生产环境首选方式,完全脱离 Web 请求,精准可靠。
- 先在 app/command/ 下创建一个命令类,比如
CleanReport.php:
命名空间为 app\command,configure() 中设名称为 report:daily,execute() 里写生成日报的逻辑(如导出数据、发邮件、更新统计表)。
- 通过 SSH 登录服务器,运行
crontab -e编辑计划任务; - 添加一行,例如每天凌晨 2 点执行:
0 2 * * * /usr/bin/php /var/www/myproject/think report:daily >> /var/log/daily-report.log 2>&1
- 注意替换路径和 PHP 解释器位置(可用
which php查); - 确保
runtime/目录可写,日志能正常记录; - 保存后立即生效,无需重启任何服务。
用第三方扩展集中管理(适合多任务场景)
如果项目里定时任务较多,推荐安装 top-think/think-crontab 扩展,把所有周期配置收口到代码中。
- 执行
composer require top-think/think-crontab; - 在
config/crontab.php中定义任务:
return ['tasks' => [['task' => \app\task\DailyReport::class, 'expression' => '0 2 * * *']]];
- 再新建
app/task/DailyReport.php,实现run()方法; - 最后在服务器 Crontab 中只加一条总入口:
* * * * * cd /var/www/myproject && php think crontab:check >> /dev/null 2>&1
这个命令每分钟检查一次,按配置表达式自动触发对应任务,维护更方便。
用宝塔面板可视化配置(适合不会命令行的开发者)
如果你用的是宝塔面板,无需手写 Crontab:
- 进入「计划任务」→「添加计划任务」;
- 任务类型选「Shell 脚本」;
- 脚本内容填:
cd /www/wwwroot/myproject && /www/server/php/81/bin/php think report:daily(PHP 路径以宝塔实际为准); - 执行周期选「每天」,并设置具体时间(如 02:00);
- 日志路径可选填,便于排查失败原因。
注意事项和常见问题
每天执行看似简单,但容易卡在几个细节上:
-
时区要一致:确认服务器系统时区(
date命令)、PHP 时区(date_default_timezone_set())、Crontab 解析时区三者统一,否则可能晚 8 小时执行; -
路径要用绝对路径:Crontab 默认工作目录不是项目根目录,
cd或直接写全路径; -
权限问题常静默失败:确保
think文件有执行权限(chmod +x think),runtime可写,PHP 进程用户(如 www)对相关目录有操作权; - 避免重复执行:如果任务耗时较长(如超 1 分钟),建议在脚本开头加进程锁或判断上一次是否完成,防止重叠运行。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











