laravel redis队列生产部署需打通连接、权限、隔离、守护四关:验证redis服务与php扩展,配置.env和database.php中redis连接参数,设置queue.php中命名空间化队列名,任务类实现shouldqueue接口,最后用supervisor守护queue:work进程。

让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.0.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 SendEmailJob。
第二步:打开生成的app/Jobs/SendEmailJob.php,确认类顶部实现了ShouldQueue接口——没实现这个接口的任务,哪怕写了::dispatch(),也会被 Laravel 当作普通 PHP 对象同步执行,根本不会进 Redis 队列。
第三步:在控制器中调用分发逻辑:dispatch(new SendEmailJob());。这一步操作起来很简单,直接把任务对象传进去就行。
第四步:执行php artisan config:clear。Laravel 会缓存配置,改了.env不清缓存等于白改。
启动监听器并用Supervisor守护进程
方法一:开发调试时快速验证
运行php artisan queue:work redis --verbose,看控制台是否输出Processing或Failed日志。终端关闭后进程就停,仅限临时测试。
方法二:生产环境必须用Supervisor管理
写入/etc/supervisor/conf.d/laravel-queue.conf:
[program:laravel-queue]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/myapp/artisan queue:work redis --sleep=3 --max-jobs=1000 --max-time=3600
autostart=true
autorestart=true
startsecs=5
user=www-data
numprocs=2
redirect_stderr=true
stdout_logfile=/var/log/supervisor/laravel-queue.log
配完立即执行三步:supervisorctl reread → supervisorctl update → supervisorctl start laravel-queue:*。
【queue:listen已被Laravel弃用】:它每次启动新进程,开销大、不可控,别再用。











