我们正在使用这个 XMPP 库 为网络上的许多设备设置存在(我们保持所有套接字打开并根据需要更改存在)。它似乎工作得很好,除了它很慢。查看库后,我发现以下代码是问题所在(在此 file 中):
stream_set_timeout($this->connection, 0, $this->timeout);
本质上,
$this->timeout
被设置为 150000
(150 毫秒)。在深入研究(并更多地研究套接字如何工作)后,这是由于 Prosody XMPP 服务器 未在 XML 响应中获取换行符或 EOF 字符引起的。本质上,while 循环必须在以下代码中超时才能读取所有内容:
while ($out = fgets($this->connection)) {
$response .= $out;
}
我们最初的解决方案是简单地减少超时以使其更快,但是,如果服务器处于负载状态,我们不能保证我们的超时(现在设置为大约 10 毫秒)总是足够长。
我尝试使用
stream_get_line
代替并使用>
字符作为分隔符,但它仍然需要在循环后超时(即最后一个fgets($this->connection)
将必须超时)。我也试过让它成为非阻塞的,但我最终收到如下错误的管道错误:
fwrite(): send of 179 bytes failed with errno=32 Broken pipe
我们有没有可能在不依赖超时的情况下读取输出?
我注意到 this 作为 Go 中可能的解决方案,但我不知道如何将其翻译成 PHP。