TP6定时任务需用supervisord或systemd守护timer:run进程,不可直接前台运行或用cron反复调用;否则会导致进程堆积、OOM或意外退出。

ThinkPHP6 定时任务本身不提供原生守护进程启动命令,timer:run 是唯一官方支持的长驻调度命令,但必须配合外部进程守护工具运行,不能直接用 php think timer:run 在前台启动后就认为“已守护”。
✅ 正确的守护启动方式(推荐 supervisord)
php think timer:run
⚠️ 注意:这条命令不能单独执行,它只是启动一个常驻 PHP 进程。要真正实现“守护”,需交由 supervisord 管理:
-
创建配置文件(如
/etc/supervisor/conf.d/myapp-timer.conf):[program:myapp-timer] command=/usr/bin/php /var/www/myapp/think timer:run directory=/var/www/myapp user=www autostart=true autorestart=true startsecs=5 redirect_stderr=true stdout_logfile=/var/log/myapp-timer.log
-
重载并启动:
supervisorctl reread supervisorctl update supervisorctl start myapp-timer
✅ 替代方案:systemd(无 supervisord 时)
创建服务文件 /etc/systemd/system/myapp-timer.service:
[Unit] Description=ThinkPHP6 Timer Service After=network.target [Service] Type=simple User=www WorkingDirectory=/var/www/myapp ExecStart=/usr/bin/php /var/www/myapp/think timer:run Restart=always RestartSec=5 StandardOutput=append:/var/log/myapp-timer.log StandardError=append:/var/log/myapp-timer.log [Install] WantedBy=multi-user.target
启用服务:
systemctl daemon-reload systemctl enable myapp-timer systemctl start myapp-timer
❌ 常见错误做法(务必避免)
* * * * * cd /path && php think timer:run
→ 每分钟启一个新进程,旧进程未退出,导致堆积、端口冲突、OOM 被杀。nohup php think timer:run > /dev/null 2>&1 &
→ 进程意外退出后不会自动拉起,不可靠。直接在终端运行
php think timer:run后关闭 SSH
→ 进程随会话终止,立即退出。
? 补充说明
-
timer:run是 ThinkPHP 6.3+ 内置命令(非schedule:run),支持毫秒级任务注册,依赖 Workerman 底层。 - 确保项目已安装
topthink/think-worker扩展(composer require topthink/think-worker)。 - CLI 模式下注意
.env加载、数据库连接配置(如localhost在 CLI 中可能解析失败,建议改用127.0.0.1)。
不复杂但容易忽略。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











