
本文介绍在 laravel 中通过启动多个队列工作进程(queue worker)实现 jobs 并发执行,显著提升如验证码获取等耗时任务的吞吐量,无需修改任务逻辑即可成倍缩短整体处理时间。
本文介绍在 laravel 中通过启动多个队列工作进程(queue worker)实现 jobs 并发执行,显著提升如验证码获取等耗时任务的吞吐量,无需修改任务逻辑即可成倍缩短整体处理时间。
在 Laravel 应用中,当批量分发耗时任务(例如每个 GetCaptcha Job 执行约 10 秒)时,若仅依赖单个队列工作进程,默认会串行处理,导致整体延迟线性增长。解决该瓶颈的核心思路并非重写 Job 逻辑,而是横向扩展队列消费者能力——即并行运行多个 queue:work 进程,让它们从同一队列(如 default)中竞争式获取并执行任务。
✅ 正确做法:启动多个队列工作进程
Laravel 原生支持开箱即用的并发处理。你只需在同一队列上启动多个独立的工作进程:
# 启动第一个 worker(监听 default 队列) php artisan queue:work --queue=default # 在新终端中启动第二个 worker php artisan queue:work --queue=default # 可继续启动第三个、第四个……(根据 CPU 核心数与内存合理规划) php artisan queue:work --queue=default
? 提示:每个 queue:work 进程默认独占一个 PHP CLI 实例,彼此完全隔离,自动实现任务负载均衡(基于 Redis/Database 队列的原子出队机制)。
? 生产环境配置(以 Supervisor 为例)
本地多终端调试可行,但生产环境需由进程管理器保障稳定性与自愈能力。推荐使用 Supervisor,并在配置中设置 numprocs:
[program:laravel-worker] process_name=%(program_name)s_%(process_num)02d command=php /var/www/your-app/artisan queue:work --queue=default --sleep=3 --tries=3 autostart=true autorestart=true user=www-data numprocs=4 ; ← 关键:启动 4 个并发 worker redirect_stderr=true stdout_logfile=/var/log/your-app-worker.log
执行 supervisorctl reread && supervisorctl update && supervisorctl start laravel-worker:* 即可生效。
⚠ 注意事项与最佳实践
- 队列驱动选择:确保使用支持高并发的驱动(如 redis 或 database),避免 sync(同步模式)或 sqs(存在可见性超时限制);
- 资源监控:并发数不宜盲目增加。建议初始值设为 CPU 核心数 × 1.5,并结合内存占用、Redis 连接数、数据库连接池进行压测调优;
- Job 原子性:所有并发 Job 必须是无状态、可重入的;若涉及共享资源(如数据库记录),需自行加锁或使用 DB::transaction() + 唯一约束规避竞态;
- 失败处理:启用 --tries=3 和 --delay=3 参数,配合 failed_jobs 表与 queue:retry 命令实现可靠重试;
- 优雅重启:部署新代码后,使用 php artisan queue:restart 通知所有 worker 重新加载,避免旧进程持续运行。
通过上述配置,原本需 100 秒完成的 10 个 GetCaptcha 任务,在 4 个并发 worker 下理论最短耗时可压缩至约 30 秒内(取决于 I/O 与外部服务响应),大幅提升 API 吞吐能力与用户体验。










