我正在使用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期望的那样结束流,但这是一个黑暗的镜头。我如何阅读流?
答案 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"];
}
那样,你会用两个块读取所有内容....我还没有测试过这段代码,但我记得前一段时间遇到类似的问题并用这样的东西修复它。
希望它有所帮助!