读取服务器发送的 XML 数据,如果它没有在 PHP 中发送新行

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

我们正在使用这个 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。

php sockets stream xmpp
© www.soinside.com 2019 - 2024. All rights reserved.