使用SSL时PHP fread会挂起

时间:2011-09-21 14:12:13

标签: php fsockopen openvas

我正在使用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期望的那样结束流,但这是一个黑暗的镜头。我如何阅读流?

1 个答案:

答案 0 :(得分:4)

我相信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"];
}

那样,你会用两个块读取所有内容....我还没有测试过这段代码,但我记得前一段时间遇到类似的问题并用这样的东西修复它。

希望它有所帮助!