Подтвердить что ты не робот

PHP file_get_contents игнорирует таймаут?

$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 segs, не должно быть около пяти секунд.

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

4b9b3361

Ответ 1

Вы устанавливаете таймаут чтения с помощью 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