PHP fread зависает при использовании SSL - PullRequest
1 голос
/ 21 сентября 2011

Я использую 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, но это выстрел в темноте.Как мне прочитать поток?

1 Ответ

4 голосов
/ 21 сентября 2011

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

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

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

...