Predis 给出“从服务器读取行时出错”

问题描述 投票:0回答:7

我正在使用predis,它订阅了一个频道并正在收听。它抛出以下错误(如下)并在 60 秒后死亡。这肯定不是我的网络服务器错误或超时。

这里正在讨论类似的问题。没能得到太多。

我尝试将 predis conf 文件中的 connection_timeout 设置为 0,但没有多大帮助。

此外,如果我继续使用(向其发送数据并进行处理)工作程序,它不会给出任何错误。所以它可能在某个地方超时,这也有联系。

这是我的代码片段,它可能会产生错误,因为如果将数据提供给工作人员,它会运行此代码并继续,之后不会产生错误。

$pubsub = $redis->pubSub(); $pubsub->subscribe($channel1); foreach ($pubsub as $message) { //doing stuff here and unsubscribing from channel }
追踪

PHP Fatal error: Uncaught exception 'Predis\Network\ConnectionException' with message 'Error while reading line from the server' in Predis/Network/ConnectionBase.php:159 Stack trace: #0 library/vendor/predis/lib/Predis/Network/StreamConnection.php(195): Predis\Network\ConnectionBase->onConnectionError('Error while rea...') #1 library/vendor/predis/lib/Predis/PubSub/PubSubContext.php(259): Predis\Network\StreamConnection->read() #2 library/vendor/predis/lib/Predis/PubSub/PubSubContext.php(206): Predis\PubSub\PubSubContext->getValue() #3 pdf/file.php(16): Predis\PubSub\PubSubContext->current() #4 {main} thrown in Predis/Network/ConnectionBase.php on line 159
也检查了redis.conf超时,它也被禁用了。

php redis
7个回答
45
投票
只需将

read_write_timeout

 连接参数设置为 0 或 -1 即可解决此问题。例如

$redis = new Predis\Client('tcp://10.0.0.1:6379'."?read_write_timeout=0");

设置连接参数

记录在自述文件中。 Redis 的作者在 GitHub 上的一个问题中指出了

read_write_timeout
参数与此错误的相关性,其中他指出:

如果您在类似守护进程的脚本中使用 Predis,则如果您想完全禁用超时,则应将
read_write_timeout

设置为

-1
(此值适用于旧版本和新版本的 Predis)。另外,请记住,您必须通过在
redis.conf
中设置
timeout = 0
来禁用 Redis 的默认超时,否则 Redis 将在 300 秒不活动后断开空闲客户端的连接。


7
投票


1
投票

我们是如何知道这个问题的? 在 php 中,我们在创建套接字时收到“无法分配请求的地址”错误(错误代码 99)。


1
投票
/etc/redis/redis.conf

,设置 timeout = 0



0
投票
Redis Heroku

切换到 Redis Enterprise 插件解决了这个问题,然后: use Predis\Client as PredisClient;

解决与 GuzzleHttp\Client 的冲突。你可以离开

作为 PredisClient

如果您不使用 GuzzleHttp,则行。

然后连接:

$redisClient = new PredisClient(array( 'host' => parse_url(env('REDIS_URL'), PHP_URL_HOST), 'port' => parse_url(env('REDIS_URL'), PHP_URL_PORT), 'password' => parse_url(env('REDIS_URL'), PHP_URL_PASS) )

);

(您可以在 Heroku 配置变量中找到自动预填充的“REDIS_URL”)。


0
投票
Laravel sail

现在想使用 artisanserve ,您应该转到您的 .env 文件并将

REDIS_HOST
从 Redis 更改为
127.0.0.1


0
投票
Redis

。 所以,我开始挖掘这个并改变

Redis
属性,但真正的问题是另一个动作永远阻止
PHP
,而
Redis
首先死了。 调试并修复该过程后,一切正常。
    

© www.soinside.com 2019 - 2024. All rights reserved.