Lumen 8.0使用DigitalOcean外部Redis作队列连接时报读取错误如何解决
问题原因
你遇到的报错核心是DigitalOcean 托管 Redis 服务默认仅接受 TLS 加密连接,你当前的配置虽然在.env里声明了REDIS_SCHEME=tls,但Lumen的默认配置没有读取该参数,还是用tcp协议发起连接,被服务端主动断开后就抛出「Error while reading line from the server」错误。
解决步骤
- 补全config/database.php的Redis连接配置
Lumen默认的database.php配置中没有引入scheme参数,需要手动添加读取.env的配置项,同时加TLS校验相关的上下文配置:
- 补全config/database.php的Redis连接配置
// config/database.php 'redis' => [ 'client' => env('REDIS_CLIENT', 'predis'), 'default' => [ 'host' => env('REDIS_HOST', '127.0.0.1'), 'password' => env('REDIS_PASSWORD', null), 'port' => env('REDIS_PORT', 6379), 'database' => env('REDIS_DB', 0), // 新增以下两项配置 'scheme' => env('REDIS_SCHEME', 'tcp'), 'context' => [ 'stream' => [ 'verify_peer' => true, 'verify_peer_name' => true, ], ], ], ],
- 调整config/queue.php的Redis队列配置
不要将read_write_timeout设为-1,DigitalOcean 托管Redis的默认空闲连接超时时间为300秒,设置负数会导致连接被服务端断开后客户端无法感知重连:
- 调整config/queue.php的Redis队列配置
// config/queue.php 'redis' => [ 'driver' => 'redis', 'connection' => env('QUEUE_REDIS_CONNECTION', 'default'), 'queue' => 'default', 'retry_after' => 90, 'block_for' => null, 'read_write_timeout' => 60, // 修改为小于300的数值即可 ],
- 确认Lumen已加载Redis配置和服务
打开bootstrap/app.php,确保已经手动加载database配置、注册Redis服务提供者(Lumen默认不会自动注册这两项):
- 确认Lumen已加载Redis配置和服务
// 加载database配置文件 $app->configure('database'); // 注册Redis服务提供者 $app->register(Illuminate\Redis\RedisServiceProvider::class);
- 验证网络权限
登录DigitalOcean控制台,进入你所用的Redis实例的「设置」页面,确认部署Lumen服务的服务器公网IP已经被添加到Redis的IP白名单中,未加白的IP会被服务端主动拒绝连接。
- 验证网络权限
- 生效配置并测试
清理配置缓存后启动队列测试:
- 生效配置并测试
php artisan config:clear php artisan queue:work redis --tries=3
内容的提问来源于stack exchange,提问作者Shakil Anwar
相关产品推荐
相关产品推荐

