在生产环境下,推荐使用 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 找不到解释器或使用错误版本。
第二步:手动测试队列命令
在配置 Supervisor 之前,必须先确保队列命令能手动运行。进入项目根目录,执行 php think queue:work。如果这一步报错,先解决代码或配置问题,不要直接配 Supervisor,否则守护进程会无限重启。
第三步:初始化日志目录
Supervisor 不会自动创建日志父目录。执行以下命令确保目录存在且权限正确:
sudo mkdir -p /var/log/supervisor
sudo chown www:www /var/log/supervisor
第四步:编写 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 是否自动重启了它。
常见坑
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/