ThinkPHP6 生产环境必须使用 queue:work 配合 Supervisor 守护,其中--sleep=3 和--max-jobs=1000 是关键参数,可避免进程内存累积和 CPU 无限占用问题。
原因分析
queue:listen 是开发模式下的轮询监听机制,每次有任务就 fork 新进程执行,长期运行会累积内存且不自动重载代码。根据 2026 年 4 月 12 日的部署实践资料,queue:listen 每次执行都重新加载整个框架,开销大;而 queue:work 启动一次后复用实例,更轻量。ThinkPHP 6+ 版本中 queue:work --daemon 已被废弃,新版只支持非 daemon 模式配合进程管理器兜底。生产环境若未配置--sleep 和--max-jobs 参数,在 Redis 连接异常时会疯狂重试导致 CPU 占用率飙升。
环境准备与版本锁定
ThinkPHP6 要求 PHP 版本不低于 7.2,并且需要开启 pcntl 扩展,检查方法为执行 php -m | grep pcntl。对于 Ubuntu/Debian 系统,安装命令为 sudo apt-get install php7.4-pcntl。使用 Composer 安装 think-queue 时,建议在 composer.json 中明确指定版本号避免自动升级带来不兼容问题,生产环境推荐配置为{"require":{"topthink/think-queue":"^3.0.12"}}。think-queue 3.x 版本专为 ThinkPHP6+ 设计,如果还在使用 ThinkPHP5.x,需要安装 2.x 版本,命令为 composer require topthink/think-queue:^2.0。
Supervisor 配置文件详解
主配置文件路径为/etc/supervisord.conf,子进程配置通常存放在/etc/supervisor/conf.d/或/etc/supervisord.d/目录下。启用 Web 控制台需配置[inet_http_server]段,port=127.0.0.1:9001,生产环境建议绑定内网 IP。子进程配置示例如下:[program:test_queue],command=/usr/bin/php /var/www/myapp/think queue:work redis --sleep=3 --max-jobs=1000 --tries=3,directory=/var/www/myapp,autostart=true,autorestart=true,startretries=3。务必使用绝对路径,很多人写成 php think queue:work 结果 supervisor 找不到 think 文件或工作目录不对导致配置加载失败。
Redis 驱动特殊配置
ThinkPHP 的 Redis 队列配置里,retry_after 默认是 60 秒,任务执行超过这个时间哪怕没报错也会被 Redis 标记为已过期。block_for 控制 BRPOP 阻塞等待时长,设太短会导致频繁空轮询,建议和--sleep 对齐都设为 3。如果任务本身可能耗时较长如导出大 Excel,必须调高 retry_after 同时确保 max-jobs 不太小,否则进程还没跑完就被 supervisor 杀掉。Redis 驱动下 failed_jobs 表没写入不是队列没配好,而是 Redis 驱动默认行为和数据库驱动不同,它靠 retry_after 时间戳判断是否超时失败而不是靠抛异常次数。
注意事项
第一,--queue 参数要和你投递任务时指定的队列名一致如 default、email,否则消费端收不到任务。第二,务必加--env=production 避免开发环境配置如日志级别、缓存驱动被误加载。第三,--sleep=3 表示空闲时每 3 秒轮询一次,太小加重 Redis 压力,太大延迟高。第四,部署后任务不触发消费需检查 retry_after 和 block_for 配置。第五,supervisor 配置里 command 必须带完整路径和明确参数,实际要锁定 PHP 解释器路径、项目根目录、队列连接名和超时策略。
参考来源
来源:CSDN 博客 - ThinkPHP6 消息队列避坑指南:从安装到 Supervisor 守护进程的全流程解析(2026 年 2 月 21 日)
来源:知乎/技术博客 - ThinkPHP 集成队列任务 Queue_服务器后台消费进程部署实践(2026 年 4 月 12 日)
来源:CSDN 博客 - Supervisor 从入门到实战:守护进程管理全解析(2025 年 3 月 10 日)
来源:GitHub/技术社区 - thinkphp 队列+supervisor 实践(2018 年 9 月 21 日)
原文链接:https://www.zjcp.cc/ask/9610.html
