ThinkPHP6 本身不内置 Cron 守护进程,需通过系统 crontab 调用 php think 命令执行定时任务,或配合 Supervisor 管理其内置的 think timer 常驻进程;Cron 表达式遵循标准五段格式(分 时 日 月 周),用于服务器 crontab 中触发 TP6 命令,而 Timer::rule() 中的表达式仅由 TP6 的 timer 组件解析,仍需系统级每分钟调用一次 php think timer 来驱动。

ThinkPHP6 本身不内置 Cron 守护进程,但支持通过命令行调度器(think timer)配合系统级 cron 或第三方进程管理工具(如 Supervisor)来实现定时任务。Cron 表达式本身是标准格式,与 ThinkPHP 无关,但需正确配置在服务器的 crontab 中触发 TP6 的命令。
Cron 表达式基础结构
Cron 表达式由 5 个空格分隔的时间字段组成(Linux crontab 标准),顺序为:
分钟 小时 日 月 周
- 分钟:0–59
- 小时:0–23
- 日:1–31
- 月:1–12
- 周:0–7(0 和 7 都表示周日)
支持符号:*(任意值)、,(枚举)、-(范围)、/(步长)、@reboot(启动时)等。
立即学习“PHP免费学习笔记(深入)”;
常见 ThinkPHP6 定时任务写法示例
假设你的项目根目录为 /www/wwwroot/myapp,TP6 命令行入口为 think,你想每 5 分钟执行一次自定义命令 task:sync:
✅ 正确写法(写入服务器 crontab):
*/5 * * * * cd /www/wwwroot/myapp && php think task:sync >> /www/wwwroot/myapp/runtime/log/cron.log 2>&1
其他常用场景:
- 每天凌晨 2 点执行:
0 2 * * * cd /path && php think task:backup - 每周一上午 9:30 执行:
30 9 * * 1 cd /path && php think report:daily - 每月 1 号 0 点执行:
0 0 1 * * cd /path && php think stat:monthly - 每小时第 0 和 30 分钟执行:
0,30 * * * * cd /path && php think check:health
ThinkPHP6 内部定时器(Timer)不是 Cron
TP6 的 think timer 是基于 PHP CLI 的常驻内存调度器(类似 Laravel 的 Schedule),它依赖一个长期运行的进程,不使用系统 cron 表达式,而是用 TP6 自定义语法,例如:
// app/command/Timer.php
protected function configure()
{
$this->setTitle('定时任务调度器')
->addOption('d', 'daemon', Option::VALUE_NONE, '守护模式');
}
<p>protected function execute(Input $input, Output $output)
{
Timer::rule('<em>/5 </em> <em> </em> *', 'app\command\TaskSync'); // 这里才用 cron 表达式
}⚠️ 注意:这个 Timer::rule() 中的表达式仅被 TP6 的 timer 命令解析,它本身仍需靠系统 cron 或 systemd 每分钟拉起一次 php think timer 来驱动,否则不会自动运行。
部署建议与避坑点
- 确保
php命令在 crontab 中可用(建议写绝对路径,如/usr/bin/php) - 务必用
cd /your/project/path &&切换到项目根目录,否则 TP6 无法加载配置和应用 - 添加日志重定向(
>> log 2>&1)便于排查失败原因 - 测试表达式可用在线工具验证,如 crontab.guru
- 避免在生产环境直接用
php think timer --daemon,推荐用 Supervisor 管理进程



















