redis 订阅报 Error while reading line from the server [tcp://120.**.**:6379]

1. 运行环境

Welcome to Alibaba Cloud Elastic Compute Service

1). 当前使用的 Laravel 版本?

Laravel Framework 8.83.27

2). 当前使用的 php/php-fpm 版本?

PHP 版本:
PHP 7.4.28 (cli)

php-fpm 版本:

3). 当前系统

CentOS Linux release 8.2.2004 (Core)

4). 业务环境

开发环境

5). 相关软件版本

redis_version:6.0.9

2. 问题描述?

执行订阅 操作 报 Error while reading line from the server. [tcp://120...**:6379]
代码如下

配置
config/database.php  
redis host passord 在 .env 文件已配置
   'redis' => [
       'client' => env('REDIS_CLIENT', 'predis'),
        'default' => [
            'url' => env('REDIS_URL'),
            'host' => env('REDIS_HOST', '120.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', 6379),
            'database' => 0,
            'read_write_timeout' => env('REDIS_RW_TIMEOUT', 30),  // 读写超时设定
    ]
   ]

routes\web.php
Route::get('/publish/{msg}', function ($msg) {
    \Illuminate\Support\Facades\Redis::publish('test-channel',$msg); // 发布消息
    return json_encode(['msg'=>$msg]);
});

Route::get('/subscribe', function () {
    \Illuminate\Support\Facades\Redis::subscribe(['test-channel'], function ($message) { // 订阅消息
        echo $message;
    });
});

发布OK

redis 订阅报  Error while reading line from the server

redis 订阅报  read error on connection to IP:PORT

redis 订阅报  Error while reading line from the server

订阅失败

redis 订阅报  read error on connection to IP:PORT

3. 您期望得到的结果?

期望订阅成功

4. 您实际得到的结果?

Predis\Connection\ConnectionException: Error while reading line from the server. [tcp://120.**.**.**:6379] in file /www/dana/php/blog/vendor/predis/predis/src/Connection/AbstractConnection.php on line 131

#0 /www/dana/php/blog/vendor/predis/predis/src/Connection/StreamConnection.php(286): Predis\Connection\AbstractConnection->onConnectionError()
#1 /www/dana/php/blog/vendor/predis/predis/src/PubSub/Consumer.php(116): Predis\Connection\StreamConnection->read()
#2 /www/dana/php/blog/vendor/predis/predis/src/PubSub/AbstractConsumer.php(171): Predis\PubSub\Consumer->getValue()
#3 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Redis/Connections/PredisConnection.php(45): Predis\PubSub\AbstractConsumer->current()
#4 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Redis/Connections/Connection.php(90): Illuminate\Redis\Connections\PredisConnection->createSubscription()
#5 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Redis/RedisManager.php(277): Illuminate\Redis\Connections\Connection->subscribe()
#6 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php(261): Illuminate\Redis\RedisManager->__call()
#7 /www/dana/php/blog/routes/web.php(46): Illuminate\Support\Facades\Facade::__callStatic()
#8 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Routing/Route.php(238): Illuminate\Routing\RouteFileRegistrar->{closure}()
#9 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Routing/Route.php(208): Illuminate\Routing\Route->runCallable()
#10 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Routing/Router.php(721): Illuminate\Routing\Route->run()
#11 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\Routing\Router->Illuminate\Routing\{closure}()
#12 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#13 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Routing\Middleware\SubstituteBindings->handle()
#14 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(78): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#15 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Foundation\Http\Middleware\VerifyCsrfToken->handle()
#16 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#17 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\View\Middleware\ShareErrorsFromSession->handle()
#18 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(121): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#19 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(64): Illuminate\Session\Middleware\StartSession->handleStatefulRequest()
#20 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Session\Middleware\StartSession->handle()
#21 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#22 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse->handle()
#23 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(67): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#24 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Cookie\Middleware\EncryptCookies->handle()
#25 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#26 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Routing/Router.php(723): Illuminate\Pipeline\Pipeline->then()
#27 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Routing/Router.php(698): Illuminate\Routing\Router->runRouteWithinStack()
#28 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Routing/Router.php(662): Illuminate\Routing\Router->runRoute()
#29 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Routing/Router.php(651): Illuminate\Routing\Router->dispatchToRoute()
#30 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(167): Illuminate\Routing\Router->dispatch()
#31 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}()
#32 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#33 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
#34 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull->handle()
#35 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#36 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
#37 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Foundation\Http\Middleware\TrimStrings->handle()
#38 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#39 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle()
#40 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(86): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#41 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance->handle()
#42 /www/dana/php/blog/vendor/fruitcake/laravel-cors/src/HandleCors.php(38): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#43 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Fruitcake\Cors\HandleCors->handle()
#44 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#45 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Http\Middleware\TrustProxies->handle()
#46 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#47 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(142): Illuminate\Pipeline\Pipeline->then()
#48 /www/dana/php/blog/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(111): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter()
#49 /www/dana/php/blog/public/index.php(52): Illuminate\Foundation\Http\Kernel->handle()
#50 {main}
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案

你这个测试方法不对,subscribe 操作是一个阻塞操作,放到路由里测试的话,相当于让 http 请求一直处于等待的状态,超过默认连接时长或 http 请求时长的话,就会报错了。

当然,如果你请求完以后,在超时之前往 channelpublish 一条消息,这样也能正常打印,正常响应。

你这个应该放到 cli 模式下作测试,这样就不会有超时一说了。

已经亲测,放心使用。

2年前 评论
dana (楼主) 2年前
快乐的皮拉夫 (作者) 2年前
讨论数量: 7

你这个测试方法不对,subscribe 操作是一个阻塞操作,放到路由里测试的话,相当于让 http 请求一直处于等待的状态,超过默认连接时长或 http 请求时长的话,就会报错了。

当然,如果你请求完以后,在超时之前往 channelpublish 一条消息,这样也能正常打印,正常响应。

你这个应该放到 cli 模式下作测试,这样就不会有超时一说了。

已经亲测,放心使用。

2年前 评论
dana (楼主) 2年前
快乐的皮拉夫 (作者) 2年前
sanders

redis 是不是用的阿里云集群版?集群版貌似限制了不能使用 sub/pub 命令。 单机版貌似不影响。

2年前 评论
dana (楼主) 2年前

我大概知道为啥报错了,因为 订阅后长时间没有信息。然后报错了

[root@iZwz91u64hvs1r58q5s9fjZ blog]# php artisan order:expire  // 启动订阅
    ddhaoxiaohaoxiaoziyaya  // 接收信息   
   Predis\Connection\ConnectionException   // 长时间没有消息 redis 断开 然后报错

  Error while reading line from the server. [tcp://120.**.**.**:6379]

  at vendor/predis/predis/src/Connection/AbstractConnection.php:131
    127*/
    128protected function onConnectionError($message, $code = 0)
    129{
    130CommunicationException::handle(131new ConnectionException($this, "$message [{$this->getParameters()}]", $code)
    132);
    133}
2年前 评论
快乐的皮拉夫 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!