1

fsockopen用来连接到 OpenVAS 管理器并发送 XML。我正在使用的代码是:

$connection = fsockopen('ssl://'.$server_data['host'], $server_data['port']);
stream_set_timeout($connection, 5);
fwrite($connection, $xml);

while ($chunk = fread($connection, 2048)) {
    $response .= $chunk;
}

然而,在读取前两个数据块后,PHP 挂在 fread 上,并且在 5 秒后没有超时。我尝试过使用stream_get_contents,它给出了相同的结果,但是如果我只使用一个 fread,它可以正常工作,只是我想阅读所有内容,无论长度如何。

我猜,这是 OpenVAS 的一个问题,它不会像 PHP 期望的那样结束流,但这是在黑暗中的一枪。如何阅读流?

4

1 回答 1

5

我相信 fread 挂了,因为在最后一个块上,它期望 2048 字节的信息并且可能得到的信息更少,所以它一直等到超时。

您可以尝试像这样重构您的代码:

$bytes_to_read = 2048;
while ($chunk = fread($connection, $bytes_to_read)) {
  $response .= $chunk;
  $status = socket_get_status ($connection);
  $bytes_to_read = $status["unread_bytes"];
}

这样,您将分两块阅读所有内容....我还没有测试过这段代码,但我记得不久前遇到过类似的问题并用类似的东西修复它。

希望能帮助到你!

于 2011-09-21T14:30:22.477 回答