QUEUE_CONNECTION不生效是因为队列worker进程未重启,其内存中已固化配置;需终止worker、运行php artisan config:cache后重新启动。

为什么 .env 里的 QUEUE_CONNECTION 不生效?
Laravel 启动时会缓存配置,php artisan config:clear 之后改 .env 还是没用——大概率是队列 worker 进程没重启。Laravel 的队列 worker(比如 php artisan queue:work)启动后会把配置“固化”进内存,后续 .env 变更完全不影响它。
- 必须手动终止正在运行的
queue:work进程(kill或supervisorctl stop) - 修改
.env后,先运行php artisan config:cache(不是config:clear),再重新启 worker - 如果用
queue:listen,它会监听文件变化并自动 reload,但性能差、不推荐生产环境用
QUEUE_CONNECTION 和 QUEUE_DRIVER 到底该用哪个?
Laravel 5.7+ 已废弃 QUEUE_DRIVER,只认 QUEUE_CONNECTION。如果你在旧项目里看到两者共存,优先以 QUEUE_CONNECTION 为准;如果只配了 QUEUE_DRIVER,它会被忽略,Laravel 默认回退到 sync。
- Laravel 6+ 完全删除对
QUEUE_DRIVER的支持,硬写进去也不会报错,但无效 -
config/queue.php里的'default' => env('QUEUE_CONNECTION', 'sync')是唯一入口 - 检查是否生效:运行
php artisan tinker,输入config('queue.default'),看返回值是不是你预期的连接名(如redis)
想临时跳过队列,又不想改 .env?
开发调试时经常要绕过异步逻辑直接执行任务,最安全的做法不是注释配置,而是用代码级覆盖:
- 在
AppServiceProvider::boot()里加:Queue::fake();—— 所有任务被拦截,不投递也不执行,适合测试 - 临时强制同步执行:设环境变量
QUEUE_CONNECTION=sync,但注意这会影响所有队列调用,包括你可能没意识到的第三方包 - 更精细控制:在具体 dispatch 处用
dispatch((new YourJob())->onConnection('sync')),只改这一条,不影响全局
Redis 队列连不上,但 redis-cli 能通?
常见原因是 Laravel 的 Redis 配置和 CLI 不一致:CLI 默认走 127.0.0.1:6379,而 Laravel 从 config/database.php 读 redis 配置,且队列用的是 config/queue.php 里 connections.redis 下的 'connection' 字段(默认 'default'),它指向 database.redis 的某个键。
- 检查
config/queue.php中connections.redis.connection值是否对应config/database.php里存在的 redis 配置名(比如写成了'local',但database.php里只有'default') - Redis 密码若含特殊字符(如
@、/),必须 URL 编码后填入REDIS_PASSWORD,否则解析 URL 失败,静默 fallback 到无密码 -
php artisan queue:work --verbose启动时如果卡住不动,大概率是 Redis 连接阻塞,不是认证失败
配置和连接细节藏得深,改完别只信 .env,一定用 config() 函数现场验证。


















