在Laravel生产环境需通过Supervisor的numprocs或Horizon的processes字段精确控制队列并发数,而非依赖--max-jobs等生命周期参数;Supervisor中numprocs硬限进程数并自动拉起崩溃进程,Horizon支持固定分配或auto动态调节但受processes上限约束。

在Laravel生产环境中精确控制队列并发数,防止Redis连接耗尽、数据库连接池打满或CPU过载,必须绕过默认的全局配置,对每个监听进程单独限定处理能力。
确认当前并发配置来源
运行php artisan queue:work --help,查看--max-jobs和--max-time参数说明——它们仅限制单个worker生命周期,不控制并发数。
真正决定并发的是Supervisor配置中的numprocs值或Horizon配置中的processes字段。若未用Supervisor或Horizon,则php artisan queue:work默认只启1个进程,无论服务器有多少核。
使用Supervisor硬限并发数
方法一:为每个队列连接定义独立进程组
编辑/etc/supervisor/conf.d/laravel-worker.conf,写入以下内容:
[program:laravel-worker-high]
command=php /var/www/myapp/artisan queue:work redis --queue=high --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
user=www-data
numprocs=4
redirect_stderr=true
stdout_logfile=/var/www/myapp/storage/logs/worker-high.log
[program:laravel-worker-default]
command=php /var/www/myapp/artisan queue:work redis --queue=default --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
user=www-data
numprocs=6
redirect_stderr=true
stdout_logfile=/var/www/myapp/storage/logs/worker-default.log
【numprocs=4 和 numprocs=6 是硬性并发上限,不可超过】:Supervisor会严格维持该数量的常驻进程,哪怕其中某个进程崩溃也会立即拉起新进程补位。
方法二:用process_name实现细粒度分组
在同一个program块中添加:
process_name=%(program_name)s_%(process_num)02d
这样当numprocs=8时,会生成laravel-worker_00到laravel-worker_07共8个独立进程,每个都占用一个Redis连接和一个PHP-FPM子进程。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
通过Horizon动态调节并发
第一步:确认已安装Horizon并发布配置
执行php artisan horizon:install,再运行php artisan vendor:publish --provider="Laravel\Horizon\HorizonServiceProvider"。
第二步:修改config/horizon.php中environments段
'production' => [
'supervisor-long' => [
'connection' => 'redis',
'queue' => ['long'],
'balance' => 'false',
'processes' => 2,
'memory' => 128,
'timeout' => 3600,
],
'supervisor-short' => [
'connection' => 'redis',
'queue' => ['short'],
'balance' => 'auto',
'processes' => 8,
'memory' => 64,
'timeout' => 60,
],
],
注意'balance' => 'false'表示禁用自动负载均衡,强制按配置固定分配进程数;而'balance' => 'auto'会让Horizon根据队列积压量动态增减进程,但上限仍受processes约束。
第三步:重启Horizon服务
执行php artisan horizon:terminate,Horizon会在下次心跳检测时自动拉起新进程,无需手动kill或supervisor reload。
验证并发是否生效
① 查看当前活跃的queue:work进程数:
ps aux | grep 'queue:work' | grep -v grep | wc -l
② 进入Redis CLI,执行llen prod:high和llen prod:default(队列名需与config/queue.php中一致),对比积压量与进程数比值——若积压远高于进程数,说明并发设置偏低;若积压持续为0但CPU使用率不足30%,说明并发可能过高造成空转。
③ 检查Supervisor状态:
sudo supervisorctl status,输出中每行末尾的数字代表当前运行中的进程数,应与配置的numprocs完全一致。
执行sudo supervisorctl reread && sudo supervisorctl update使新配置生效。

















