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

p1iqtdky  于 2023-08-02  发布在  Redis
关注(0)|答案(6)|浏览(111)

我使用predis,它订阅了一个频道并收听。它抛出以下错误(下图),并在60秒后停止。这肯定不是我的网络服务器错误或其超时。
有一个类似的问题正在讨论here。不能得到太多。
我尝试将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超时,它也被禁用。

yptwkmov

yptwkmov1#

只需将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秒的不活动后断开空闲客户端的连接。

5lwkijsr

5lwkijsr2#

我有类似的问题,更好的解决方案是不设置超时为0,但使用指数回退,并设置上限和下限。将配置参数connection_timeout更改为0也可以解决此问题。

kkbh8khc

kkbh8khc3#

我找到了解决问题的办法。因此,应用程序服务器可以连接到另一台机器上的特定应用程序的端口是有限的。这些港口已经枯竭。我们提高了限额,问题就解决了。
我们是如何知道这个问题的?在php中,我们在创建套接字时得到“无法分配请求的地址”错误(错误代码99)。

gfttwv5a

gfttwv5a4#

/etc/redis/redis.conf,设置

timeout = 0

字符串

x8diyxa7

x8diyxa75#

我正在使用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)
)


);
(You可以在Heroku配置变量中找到自动预填充的'REDIS_URL')。

du7egjpx

du7egjpx6#

如果您使用了Laravel sail,现在想使用artisanserve,您应该转到.env文件,并将REDIS_HOST从Redis更改为127.0.0.1

相关问题