PHP线程在使用SSL时挂起


PHP fread hangs when using SSL

我使用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挂起读取并且不会在5秒后超时。我尝试过使用stream_get_contents,它给出了相同的结果,但如果我只使用一个读取,它工作正常,只是我想读取所有内容,无论长度。

我猜,这是一个问题与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"];
}

这样,您将分成两部分阅读....我还没有测试过这段代码,但我记得前一段时间有一个类似的问题,并用这样的东西修复它。

希望有帮助!