我正在使用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超时,它也被禁用了。
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
设置为
(此值适用于旧版本和新版本的 Predis)。另外,请记住,您必须通过在-1
redis.conf中设置来禁用 Redis 的默认超时,否则 Redis 将在 300 秒不活动后断开空闲客户端的连接。timeout = 0
我们是如何知道这个问题的? 在 php 中,我们在创建套接字时收到“无法分配请求的地址”错误(错误代码 99)。
,设置
timeout = 0
切换到 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”)。
现在想使用 artisanserve ,您应该转到您的 .env
文件并将
REDIS_HOST
从 Redis 更改为 127.0.0.1
Redis
。 所以,我开始挖掘这个并改变
Redis
属性,但真正的问题是另一个动作永远阻止 PHP
,而 Redis
首先死了。
调试并修复该过程后,一切正常。