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}
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
最佳答案

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

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

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

已经亲测,放心使用。

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

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

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

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

已经亲测,放心使用。

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

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

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

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

[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}
1年前 评论
快乐的皮拉夫 1年前

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