Flu*_*ffy 1 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;
}
Run Code Online (Sandbox Code Playgroud)
但是在读取前两个数据块后,PHP 挂起 fread 并且在 5 秒后没有超时。我试过使用stream_get_contents,它给出了相同的结果,但是如果我只使用一个 fread,它可以正常工作,只是我想阅读所有内容,无论长度如何。
我猜,这是 OpenVAS 的一个问题,它没有像 PHP 期望的那样结束流,但这是在黑暗中的一个镜头。我如何读取流?
我相信 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"];
}
Run Code Online (Sandbox Code Playgroud)
这样,您将分两部分阅读所有内容......我还没有测试过这段代码,但我记得不久前遇到了类似的问题,并用类似的方法修复了它。
希望能帮助到你!