PHP file_get_contents игнорирует тайм-аут? - PullRequest
14 голосов
/ 11 сентября 2010
$url = 'http://a.url/i-know-is-down';

//ini_set('default_socket_timeout', 5);

$ctx = stream_context_create(array(
    'http' => array(
        'timeout' => 5,
        'ignore_errors' => true
        )
    )
);

$start = microtime(true);
$content = @file_get_contents($url, false, $ctx);
$end = microtime(true);
echo $end - $start, "\n";

ответ, который я получаю, обычно составляет 21,232 сегмента, не должно быть около пяти секунд ???

Раскомментирование строки ini_set совсем не помогает.

1 Ответ

14 голосов
/ 11 сентября 2010

Вы устанавливаете read timeout с помощью socket_create_context.Если страница , к которой вы пытаетесь получить доступ, не существует, то сервер разрешит вам подключиться и выдаст вам 404. Однако, если сайт не существует (не будетразрешить или нет веб-сервера за ним), то file_get_contents() будет игнорировать тайм-аут чтения, потому что он еще не установил тайм-аут подключения к нему.

Я не думаю, что вы можете установить тайм-аут соединения в file_get_contents.Недавно я переписал некоторый код для использования fsockopen() именно потому, что он позволяет указать время ожидания соединения

$connTimeout = 30 ;
$fp = fsockopen($hostname, $port, $errno, $errstr, $connTimeout);

Конечно, переход к fsockopen потребует от вас fread() из него в цикленемного сочиняя ваш код.Тем не менее, он дает вам больше контроля при обнаружении тайм-аутов чтения при чтении с него, используя stream_get_meta_data()

http://php.net/stream_get_meta_data

...