ThinkPHP6需借助系统crontab实现凌晨自动执行:先编写命令行指令(如daily:clean),再通过crontab绝对路径调用,并确保权限、路径和环境变量正确;无服务器权限时可用HTTP触发式模拟,但依赖访问流量。

ThinkPHP6 本身不内置 Cron 调度器(不像 Laravel 的 scheduler),要实现“凌晨自动执行”,必须借助操作系统级的 crontab 来触发,再由 ThinkPHP 承载具体逻辑。核心思路是:**把业务写成命令行指令,用 crontab 在指定时间调用它**。
一、先写一个可被定时调用的命令行指令
在 app/command/ 下新建文件,比如 DailyClean.php:
- 命名空间为
app\command -
configure()中设名称为daily:clean,描述清楚用途 -
execute()里写实际逻辑,例如清理日志、归档数据、发送日报等 - 确保该指令能手动运行成功:
php think daily:clean
二、配置 crontab 实现凌晨执行
通过 SSH 登录服务器,执行 crontab -e,添加一行:
0 2 * * * /usr/bin/php /var/www/myproject/think daily:clean >> /var/log/daily-clean.log 2>&1
说明:
立即学习“PHP免费学习笔记(深入)”;
-
0 2 * * *表示每天凌晨 2:00 执行(分钟 0,小时 2) -
/usr/bin/php是 PHP 解释器真实路径,可用which php确认 -
/var/www/myproject/think是项目根目录下的入口文件,需有执行权限 -
>>把标准输出和错误都记录到日志,便于排查失败原因
三、关键检查点(容易出错)
- 确认
runtime/目录对 Web 用户和 crontab 运行用户(通常是www-data或root)都有读写权限 - 避免使用相对路径——crontab 的工作目录默认不是项目根目录,所以必须用绝对路径
- 如果指令依赖环境变量(如数据库配置),不要假设 crontab 会加载你的 shell profile;必要时在 crontab 行前显式设置,例如:
PATH=/usr/local/bin:/usr/bin:/bin HOME=/var/www/myproject - 首次添加后,可等待到整点前手动执行一次命令测试逻辑是否正常
四、替代方案(适合无服务器权限场景)
若你用的是共享主机或无法操作 crontab,可启用 ThinkPHP 的「HTTP 触发式模拟 Cron」:
- 在
app/config/tags.php中注册行为钩子:'app_end' => ['\behavior\CronRun'] - 在
app/config/crons.php中定义任务:['daily_report' => ['app\job\SendDailyReport', 86400]](86400 秒 = 1 天) - 注意:该方式依赖网站有稳定访问流量,否则凌晨没人访问就不会触发
不复杂但容易忽略细节,重点是路径、权限、环境一致性这三点。



















