Predis正在提供';从服务器';读取行时出错;


Predis is giving 'Error while reading line from server'

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

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

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

此外,如果我继续使用(向它发送数据并由它处理)工作程序,它不会给出任何错误。所以这很可能是某个地方的超时,这也是相关的。

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

$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超时,它也被禁用了。

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

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

README中记录了设置连接参数。Redis的作者在GitHub上的一个问题中指出了read_write_timeout参数与该错误的相关性,他在该问题中指出:

如果您在类似守护程序的脚本中使用Predis,如果您想完全禁用超时,则应将read_write_timeout设置为-1(此值适用于Predis的旧版本和新版本)。另外,请记住,您必须通过在Redis.conf中设置timeout = 0来禁用Redis的默认超时,否则Redis将在300秒不活动后断开空闲客户端的连接。

我也遇到过类似的问题,更好的解决方案不是将超时设置为0,而是使用指数后退并设置上限和下限。将配置参数connection_timeout更改为0也将解决此问题。

我得到了问题的解决方案。因此,应用程序服务器可以连接到另一台机器上的特定应用程序的端口是有限制的。这些港口正在枯竭。我们提高了限额,问题得到了解决。

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

/etc/redis/reis.conf处,设置

timeout = 0 

我正在使用Heroku,并通过从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")。

如果您使用Laravel-sail,现在想使用手工服务,您应该转到.env文件,将REDIS_HOST从Redis更改为127.0.0.1