ThinkPHP6 如何配置 Supervisor 守护队列进程运行

文章导读
在生产环境下,推荐使用 Supervisor 来守护 ThinkPHP6 的队列监听进程,确保任务消费者持续运行且在意外退出后自动重启。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 参考来源
A A

在生产环境下,推荐使用 Supervisor 来守护 ThinkPHP6 的队列监听进程,确保任务消费者持续运行且在意外退出后自动重启。

先说结论:Supervisor 是 Linux 下管理常驻进程的标准工具,适合用来维持 ThinkPHP 队列服务的稳定性。

  • 适合:需要 7x24 小时运行队列消费者的生产环境。
  • 先准备:服务器已安装 Supervisor,ThinkPHP 队列配置已完成且可手动运行。
  • 验收:Supervisor 状态显示 RUNNING,队列任务能正常消费,日志无报错。

命令速用版

# 1. 确认 PHP 路径 (避免版本错误)
which php

# 2. 创建日志目录并授权 (避免权限错误)
sudo mkdir -p /var/log/supervisor
sudo chown www:www /var/log/supervisor

# 3. 创建配置文件
sudo vim /etc/supervisor/conf.d/think_queue.conf

# 4. 写入配置 (注意修改项目路径和 PHP 路径)
[program:think_queue]
command=/usr/bin/php /var/www/html/think queue:work `--queue`=default
process_name=%(program_name)s
numprocs=1
directory=/var/www/html
autostart=true
autorestart=true
user=www
environment=ENV_PATH="/var/www/html/.env"
redirect_stderr=true
stdout_logfile=/var/log/supervisor/think_queue.log

# 5. 重载并启动
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start think_queue

# 6. 查看状态
sudo supervisorctl status

为什么会这样

ThinkPHP 的队列命令本质是 CLI 脚本,手动在终端运行后,一旦关闭终端或进程崩溃,任务监听就会停止。生产环境不能依赖人工值守,需要一种机制在进程意外退出时自动拉起。Supervisor 就是一个进程管理工具,它监控配置的子进程,发现退出后立即重启,同时管理日志输出,避免进程挂掉后无人知晓。

分步处理

第一步:确认环境与路径

确保服务器已安装 Supervisor。如果没有,使用包管理器安装,例如 CentOS 使用 yum install supervisor,Ubuntu 使用 apt install supervisor。安装完成后确保服务已启动。

执行 which php 获取 PHP 绝对路径,避免 Supervisor 找不到解释器或使用错误版本。

ThinkPHP6 如何配置 Supervisor 守护队列进程运行

第二步:手动测试队列命令

在配置 Supervisor 之前,必须先确保队列命令能手动运行。进入项目根目录,执行 php think queue:work。如果这一步报错,先解决代码或配置问题,不要直接配 Supervisor,否则守护进程会无限重启。

第三步:初始化日志目录

Supervisor 不会自动创建日志父目录。执行以下命令确保目录存在且权限正确:

sudo mkdir -p /var/log/supervisor
sudo chown www:www /var/log/supervisor

第四步:编写 Supervisor 配置

ThinkPHP6 如何配置 Supervisor 守护队列进程运行

/etc/supervisor/conf.d/ 目录下新建配置文件,后缀通常为 .conf。重点检查以下字段:

  • command:必须使用 PHP 绝对路径和 think 文件绝对路径。
  • directory:指定项目根目录,确保 ThinkPHP 能正确加载配置。
  • user:建议指定为 Web 服务运行用户(如 www 或 www-data),避免权限问题导致文件写入失败。
  • environment:如果项目依赖特定环境变量(如 .env 文件路径),需在此显式声明。
  • stdout_logfile:指定日志路径,确保目录存在且可写。

第五步:加载配置

配置写完不要直接重启服务,使用 supervisorctl reread 读取新配置,再用 supervisorctl update 应用变更。最后使用 start 命令启动进程。

怎么验证是否生效

执行 sudo supervisorctl status,看到 think_queue 状态为 RUNNING 且 pid 稳定,说明进程存活。接着向队列推送一个测试任务,观察业务是否执行,同时查看配置的日志文件 /var/log/supervisor/think_queue.log,确认没有异常报错。如果进程挂掉,观察 Supervisor 是否自动重启了它。

ThinkPHP6 如何配置 Supervisor 守护队列进程运行

常见坑

1. 路径错误:配置中 command 和 directory 必须用绝对路径,相对路径在 Supervisor 环境下通常无效。

2. 环境变量丢失:Supervisor 启动的进程可能无法加载用户的 .env 或系统环境变量,如果项目依赖特定变量,需在配置文件的 environment 项中显式声明,例如 environment=APP_ENV="production"

3. 权限问题:日志文件目录必须存在且 Supervisor 运行用户有写入权限,否则进程会启动失败。

4. 内存泄漏:长期运行的 PHP 进程可能存在内存累积问题,建议在配置中设置 autorestart=true 并结合 numprocs 控制,或者定期重启策略。

5. 多进程冲突:如果配置 numprocs 大于 1,需确保队列任务支持并发处理,避免多条消息被重复消费或资源竞争。

参考来源

  • ThinkPHP 官方文档,队列章节,https://www.kancloud.cn/manual/thinkphp6/
  • Supervisor 官方文档,Configuration 章节,http://supervisord.org/