Laravel生产环境Redis队列需五步闭环:①验证Redis服务与phpredis/predis扩展就绪;②同步校验.env、database.php、queue.php三处连接配置;③任务类必须实现ShouldQueue接口;④执行config:clear清除配置缓存;⑤用Supervisor守护queue:work进程。

让Laravel生产环境的Redis队列真正跑起来,不是改几个配置就能上线——必须验证Redis服务可达、PHP扩展匹配、连接参数一致、队列命名隔离、任务类正确实现接口,最后用Supervisor稳定守护进程,缺一不可。
确认Redis服务与PHP扩展就绪
执行redis-cli -h 10.0.0.5 -p 6380 ping,返回PONG才算Redis服务在线且网络可达。若超时或报错,先排查防火墙、安全组和Redis绑定地址。
运行php -m | grep redis,有输出说明phpredis已启用;若无输出,需在php.ini中添加extension=redis并重启PHP-FPM。【必须区分扩展类型】:若项目用predis/predis(Composer安装),则config/database.php中'client' => 'predis'不可写成'phpredis',否则queue:work启动直接报ClassNotFound。
检查composer show predis/predis,确认版本≥2.2;旧版存在序列化兼容问题,会导致任务卡在Redis里无法反序列化执行。
同步校验三处Redis连接配置
第一步:打开.env文件,强制设置以下四行:QUEUE_CONNECTION=redisREDIS_HOST=10.0.0.5REDIS_PORT=6380REDIS_PASSWORD=null(若无密码,必须写null,不能留空或删掉该行,空字符串会触发认证失败)。
第二步:打开config/database.php,定位redis.default块,确认'database' => 1(避免与缓存共用db0),并显式加上'timeout' => 5和'read_write_timeout' => -1——不设read_write_timeout可能导致长任务阻塞后永久失联。
第三步:打开config/queue.php,找到redis驱动配置,确保'connection' => 'default'与database.php中键名完全一致,且'queue' => 'prod:notifications'(带命名空间前缀,防止开发队列污染生产数据)。
这三处配置必须严格一致,任何一处主机、端口、密码或连接名不匹配,任务都会静默积压——dispatch()成功但queue:work不消费,日志里连错误都不报。
创建可队列任务并正确分发
方法一:运行php artisan make:job ProcessImageUpload生成任务类。
方法二:打开app/Jobs/ProcessImageUpload.php,检查类声明是否包含implements ShouldQueue——没有这个接口,dispatch(new ProcessImageUpload())就是同步执行,根本不会进Redis。
方法三:在控制器中调用dispatch(new ProcessImageUpload($imageId));。这一步操作起来很简单,直接把参数传进去就行。
执行php artisan config:clear。Laravel会缓存配置,改了.env不清缓存等于白改——很多“配置生效了但队列不动”的问题都出在这一步漏掉。
启动监听器并用Supervisor守护
先临时验证:运行php artisan queue:work redis --verbose,观察终端是否持续输出Processing或Failed。如果只显示Starting process就卡住,说明Redis连接失败或队列为空。
生产环境禁用queue:listen——它每次启新进程、无内存回收,跑久必崩,官方已弃用。
配置Supervisor守护进程:
编辑/etc/supervisor/conf.d/laravel-worker.conf,写入:
[program:laravel-worker]process_name=%(program_name)s_%(process_num)02dcommand=php /var/www/myapp/artisan queue:work redis --sleep=3 --tries=3 --max-time=3600autostart=trueautorestart=trueuser=www-datanumprocs=4redirect_stderr=truestdout_logfile=/var/www/myapp/storage/logs/worker.log
保存后执行supervisorctl reread && supervisorctl update && supervisorctl start laravel-worker:*。此时4个worker进程将稳定监听prod:notifications队列。


















