Laravel生产环境队列需四步打通:确认Redis服务与PHP扩展就绪、正确配置.env与database.php/queue.php、创建实现ShouldQueue接口的任务并分发、用Supervisor守护queue:work进程。

让Laravel生产环境的队列真正跑起来,不是改完QUEUE_CONNECTION=redis就完事——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 错误。
配置.env与连接参数
打开.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配置文件: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 --sleep=3 --tries=3 --max-timeout=3600
autostart=true
autorestart=true
user=www-data
numprocs=8
redirect_stderr=true
stdout_logfile=/var/www/myapp/storage/logs/worker.log
③ 重载Supervisor配置:sudo supervisorctl reread && sudo supervisorctl update && sudo supervisorctl start laravel-worker:*
这一步做完,8个worker进程就会持续监听prod:notifications队列,自动重启、自动拉起、自动记录日志。


















