必须用Supervisor守护队列进程,否则服务器重启或终端关闭会导致queue:work中断;需先确认QUEUE_CONNECTION=redis或database(非sync),Redis需ping通,再清配置缓存,最后通过Supervisor配置多进程监听并启用failed_jobs表记录失败任务。

让Laravel生产环境的队列任务真正稳定执行,必须启动常驻监听进程并确保它不因崩溃、重启或终端关闭而中断——直接运行php artisan queue:work在服务器上只能维持几秒。
确认队列驱动与连接配置已生效
这一步漏掉会导致后续所有监听命令静默失败,且无任何报错提示。
检查.env文件中QUEUE_CONNECTION是否明确设为redis或database,【绝不能是sync】;若用redis,同步验证REDIS_HOST、REDIS_PORT可连通,执行redis-cli -h $REDIS_HOST -p $REDIS_PORT ping返回PONG才算通过。
运行php artisan config:clear && php artisan config:cache,强制刷新配置缓存——改了.env却不清缓存,监听器永远读不到新值。
手动启动监听器验证基础连通性
这是上线前必须走通的最小闭环,用于快速定位是配置问题还是环境问题。
方法一:单次执行验证
运行php artisan queue:work --once --verbose,观察控制台是否输出Processing或Failed。成功即说明驱动、连接、任务类均无硬性错误。
方法二:前台常驻监听
执行php artisan queue:work redis --queue=default --timeout=90 --sleep=3,保持终端打开,手动分发一个任务(如dispatch(new TestJob())),看是否立即触发handle()。注意:关闭终端后进程终止,仅限调试。
用Supervisor守护队列进程(生产必需)
Supervisor不是可选项,是生产环境存活保障。没有它,服务器重启、内存溢出、异常退出都会导致队列停摆。
第一步:安装Supervisor(Ubuntu示例)sudo apt update && sudo apt install supervisor
第二步:创建Laravel队列专用配置文件sudo nano /etc/supervisor/conf.d/laravel-worker.conf,填入以下内容:
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/myapp/artisan queue:work redis --queue=default --sleep=3 --timeout=90 --max-jobs=1000
autostart=true
autorestart=true
user=www-data
numprocs=2
redirect_stderr=true
stdout_logfile=/var/www/myapp/storage/logs/worker.log
第三步:重载Supervisor并启动进程sudo supervisorctl reread && sudo supervisorctl update && sudo supervisorctl start laravel-worker:*
第四步:验证进程状态
执行sudo supervisorctl status,输出应为laravel-worker:laravel-worker_00 RUNNING和laravel-worker:laravel-worker_01 RUNNING。若显示FATAL或STARTING,立刻查看worker.log末尾错误行。
配置多优先级队列监听
当业务中存在支付通知、短信告警等高优任务,以及日志归档、邮件推送等低优任务时,必须显式划分消费顺序。
方法一:单Worker轮询(轻量适用)
修改Supervisor配置中的command行:queue:work redis --queue=urgent,normal,low --sleep=2。Laravel按从左到右顺序扫描,只有urgent队列为空时才消费normal,避免低优任务阻塞高优响应。
方法二:独立Worker进程(生产推荐)
为每个优先级新建Supervisor配置段,例如laravel-worker-urgent.conf,其中command只监听--queue=urgent,并设置--timeout=45和--max-jobs=500。三个队列对应三个独立进程组,资源隔离,互不影响。
分发任务时显式指定队列:dispatch((new SendSmsNotification())->onQueue('urgent')),【不要依赖默认队列名】,否则高优任务仍会落入default被低优Worker吞掉。
启用失败任务记录与重试机制
没开启失败表,等于放弃所有异常溯源能力。
执行php artisan queue:failed-table生成迁移文件,再运行php artisan migrate创建failed_jobs表。
在config/queue.php中确认'failed' => ['driver' => 'database']已启用,且数据库连接正常。
日常运维只需两条命令:php artisan queue:failed查失败列表,php artisan queue:retry 123重试ID为123的任务。失败任务不会自动重试,必须人工干预或写定时脚本批量处理。


















