
通过启动多个队列工作进程(queue:work),laravel 可以真正并发执行多个队列任务,显著缩短整体处理时间,无需修改任务逻辑或依赖第三方扩展。
通过启动多个队列工作进程(queue:work),laravel 可以真正并发执行多个队列任务,显著缩短整体处理时间,无需修改任务逻辑或依赖第三方扩展。
在 Laravel 应用中,当需要高频调度耗时型任务(例如每个 GetCaptcha 任务需 10 秒),若默认单工作进程串行执行,100 个任务将耗时约 1000 秒(近 17 分钟)。此时,提升吞吐量的关键不在于“一次分发多个任务”,而在于让多个任务被同时消费——这正是 Laravel 原生队列系统支持的并发处理能力。
✅ 正确做法:启动多个队列工作进程
Laravel 的 queue:work 命令本身是单进程、阻塞式运行的。要实现并行,只需在同一队列(如 default)上并行启动多个独立的工作进程实例:
# 终端 Tab 1 php artisan queue:work --queue=default # 终端 Tab 2 php artisan queue:work --queue=default # 终端 Tab 3 php artisan queue:work --queue=default
每个进程将独立争抢队列中的任务(基于底层驱动如 Redis 或 Database 的原子出队机制),从而实现真正的并发执行。若你调度了 30 个 GetCaptcha::dispatch($task_id) 任务,3 个工作进程可大致将其均分,在约 100 秒内完成(理想情况下 ≈ 单任务耗时 × 任务数 ÷ 进程数)。
? 生产环境配置(推荐 Supervisor)
本地多终端调试仅适用于开发;生产环境应使用进程管理工具确保稳定性与自动重启。以 Supervisor 为例,配置 /etc/supervisor/conf.d/laravel-worker.conf:
[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 redirect_stderr=true stdout_logfile=/var/log/laravel-worker.log stopwaitsecs=3600
关键参数说明:
- numprocs=4:启动 4 个并行工作进程;
- --queue=default:明确指定监听队列,避免误消费其他队列;
- --sleep=3:空闲时休眠 3 秒,降低轮询开销;
- --tries=3:失败任务最多重试 3 次,防止死循环。
配置后执行:
sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl start laravel-worker:*
⚠ 注意事项与最佳实践
- 队列驱动必须支持原子操作:推荐使用 redis 或 database(需配合 innodb_row_lock 优化),避免 sync 或 beanstalkd(旧版兼容性风险);
- 避免共享资源竞争:若多个任务写入同一数据库记录或文件,请自行添加锁(如 Cache::lock())或使用数据库乐观锁;
- 监控与限流:高并发可能加剧数据库/外部 API 压力,建议结合 throttle 中间件或队列中间件控制速率;
- 日志隔离:多个进程共用日志时易混杂,推荐按进程 ID 或使用结构化日志(如 Monolog 的 ProcessIdProcessor);
- 优雅重启:部署新代码后,需 supervisorctl restart laravel-worker:* 或发送 SIGTERM 触发平滑退出(Laravel 默认支持)。
? 补充提示:无需修改任务分发代码。你当前的 GetCaptcha::dispatch($task_id)->afterCommit()->onQueue('default') 已完全正确——并发能力由消费者(worker)决定,而非生产者(dispatch)。
通过合理配置工作进程数量(通常 ≤ CPU 核心数 × 2),你可在不引入复杂异步框架的前提下,将 Laravel 队列压测吞吐量提升数倍,让耗时任务真正“并肩奔跑”。










