PHP fread зависает при использовании 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 зависает на fread и не истекает через 5 секунд. Я пытался использовать stream_get_contents, что дает тот же результат, НО, если я использую только один fread, он работает нормально, просто я хочу прочитать все, независимо от длины.

Я предполагаю, что это проблема с OpenVAS, который не завершает поток так, как этого ожидает PHP, но это выстрел в темноту. Как читать поток?


person Fluffy    schedule 21.09.2011    source источник


Ответы (1)


Я полагаю, что 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"];
}

Таким образом, вы будете читать все в двух частях... Я не тестировал этот код, но я помню, что некоторое время назад у меня была похожая проблема, и я исправил ее с помощью чего-то вроде этого.

Надеюсь, поможет!

person Deleteman    schedule 21.09.2011