ThinkPHP6在IIS下需用Windows任务计划调用CLI执行定时任务;确保php think可用、编写.bat调用schedule:run并记录日志,任务配置为最高权限运行且账户有目录读写权。

ThinkPHP6 在 IIS 环境下本身不直接支持 Web 层定时任务(如 Linux 的 crontab),必须借助 Windows 原生任务计划程序(Task Scheduler)调用 CLI 模式脚本执行。关键不是改 IIS 配置,而是让 PHP CLI 正常运行 + 任务能稳定触发。
确保 TP6 已启用 CLI 支持
- 项目根目录下已有
think可执行文件(Composer 安装时自带) - 不需要额外定义
MODE_NAME或THINK_MODE,TP6 默认识别 CLI 环境 - 测试命令是否可用:在 CMD 中进入项目目录,执行
php think hello
若输出
hello world,说明 CLI 环境就绪;若报错,请先确认 PHP 路径已加入系统PATH,且php.exe能全局调用
编写可被任务调用的批处理文件(.bat)
新建 run_task.bat,内容如下(路径按实际调整):
@echo off cd /d D:\inetpub\wwwroot\myapp D:\php\php.exe think schedule:run >> D:\logs\scheduler.log 2>&1
-
cd /d切换到项目根目录(含think文件) - 使用绝对路径调用
php.exe,避免环境变量失效问题 -
>> D:\logs\scheduler.log 2>&1把标准输出和错误统一记录,便于排查
注意:日志目录
D:\logs\需提前创建,且 IIS_IUSRS 或任务运行账户要有写入权限立即学习“PHP免费学习笔记(深入)”;
在 Windows 任务计划程序中创建任务
- 打开「任务计划程序」→「创建基本任务」
- 名称填
TP6-Scheduler,触发器设为「每天」或「每5分钟」等(根据需求) - 操作选「启动程序」,程序/脚本填
D:\path\to\run_task.bat -
关键设置:
- 勾选「不管用户是否登录都要运行」
- 勾选「不存储密码则只在用户登录时运行」→ 改为「只在用户登录时运行」并勾选「最高权限运行」
- 在「常规」选项卡中,将「配置为」选为「Windows Server 2016 或更高版本」(适配 Win2026)
- 运行账户建议设为
SYSTEM或具有读写项目目录权限的本地账户(如IIS_IUSRS不适用,需另建专用账户)
验证与排错要点
- 先双击
.bat手动运行,检查日志是否有Command "schedule:run" is not defined错误 → 表示未安装topthink/think-scheduler扩展 - 若需使用
schedule:run,执行:composer require topthink/think-scheduler
并在
config/schedule.php中定义任务(如->command('mail:send')) - 任务运行后无反应?检查:
- PHP 版本是否 ≥ 7.4(TP6 最低要求)
-
runtime/schedule/目录是否存在且可写 - 项目
.env中APP_DEBUG=true是否开启(方便日志捕获错误) - 任务属性里「历史记录」是否启用(可在 GUI 查看失败原因)
不复杂但容易忽略



















