Laravel Redis队列生产化需打通四层关卡:确认Redis服务与PHP扩展就绪、正确配置连接与队列驱动、创建并规范分发可队列任务、启动监听器并用Supervisor守护进程。

让Laravel后台任务真正跑起来,必须把Redis队列从本地调试环境推到生产可用状态——这不只是改几个配置,而是要打通连接、校验权限、隔离队列、守护进程四层关卡。
确认Redis服务与PHP扩展就绪
先验证Redis服务是否在目标服务器上运行且可被PHP访问:执行 redis-cli -h 127.0.0.1 -p 6379 ping,返回 PONG 才算通过第一关。
检查PHP是否加载了Redis扩展:运行 php -m | grep redis。如果无输出,说明未启用 phpredis;若用 predis,则确认 composer show predis/predis 能查到已安装版本(推荐 2.2+)。
【必须区分扩展类型】:config/database.php 中 'client' => 'predis' 和 'client' => 'phpredis' 不可混用,否则 queue:work 启动时直接报 ClassNotFound 错误。
配置 Redis 连接与队列驱动
打开 .env 文件,设置以下三项为强制项:
QUEUE_CONNECTION=redis
REDIS_HOST=10.0.1.5
REDIS_PORT=6380
注意:不要写 REDIS_PASSWORD= 空值,若无密码请删掉该行或设为 REDIS_PASSWORD=null;设为空字符串会导致认证失败。
编辑 config/database.php 中的 redis 配置块,确保 'default' 连接包含 'database' => 1(避免和缓存共用 db0),并显式声明 'timeout' => 5 和 'read_write_timeout' => -1。
进入 config/queue.php,找到 'redis' 配置段,将 'queue' 改为带命名空间的值:'queue' => 'prod:notifications'。这样能防止开发队列与生产队列互相干扰。
创建并分发可队列化任务
方法一:使用 Artisan 命令快速生成骨架
php artisan make:job ProcessPayment
方法二:手动创建类并实现接口
在 app/Jobs/ProcessPayment.php 中,确保类 implements ShouldQueue,且 use Dispatchable, InteractsWithQueue, Queueable, SerializesModels 四个 trait。
构造函数中只传 ID 或简单标量值,不要传 Eloquent 模型实例——序列化时可能携带大量关联数据,导致 Redis 内存暴涨甚至超限丢包。
在控制器中调用分发逻辑:
ProcessPayment::dispatch($paymentId)->onQueue('prod:payments')->delay(now()->addSeconds(30));
这行代码会把任务推入 prod:payments 队列,并延迟 30 秒执行。
启动监听器并绑定守护进程
第一步:测试单次监听是否连通
运行 php artisan queue:work --queue=prod:notifications --once,观察是否成功消费一条任务并退出。若卡住或报 Connection refused,立即回查 REDIS_HOST 和防火墙策略。
第二步:用 Supervisor 管理常驻进程
新建配置文件 /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 --queue=prod:notifications,prod:payments --sleep=3 --max-jobs=1000 --timeout=120
autostart=true
autorestart=true
user=www-data
numprocs=4
redirect_stderr=true
stdout_logfile=/var/log/laravel-worker.log
执行 supervisorctl reread && supervisorctl update && supervisorctl start laravel-worker:* 启动全部 worker。
【timeout 必须 ≤ retry_after】:config/queue.php 中 'retry_after' => 120,则命令行 --timeout=120 是安全上限;设为 180 将导致任务被重复执行两次。


















