it-swarm.com.ru

Есть ли у file_get_contents () время ожидания?

Я вызываю серию ссылок, используя метод file_get_contents() в цикле. Обработка каждой ссылки может занять более 15 минут. Теперь я беспокоюсь о том, имеет ли PHP file_get_contents() период ожидания?

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

Итак, скажите, пожалуйста, есть ли у file_get_contents() период ожидания. Файл, который содержит функцию file_get_contents(), имеет значение set_time_limit() ноль (неограниченно).

136
Flora Clinton

Время ожидания по умолчанию определяется default_socket_timeout ini-setting , что составляет 60 секунд. Вы также можете изменить его на лету:

ini_set('default_socket_timeout', 900); // 900 Seconds = 15 Minutes

Другой способ установить тайм-аут - использовать stream_context_create , чтобы установить тайм-аут как опции контекста HTTP используемого обертка потока HTTP :

$ctx = stream_context_create(array('http'=>
    array(
        'timeout' => 1200,  //1200 Seconds is 20 Minutes
    )
));

echo file_get_contents('http://example.com/', false, $ctx);
263
stewe

Как упоминалось в @diyism, "default_socket_timeout, stream_set_timeout и stream_context_create timeout - это все тайм-ауты каждой строки чтения/записи, а не всего тайм-аута соединения." И лучший ответ @stewe меня не сработал.

В качестве альтернативы использованию file_get_contents вы всегда можете использовать curl с таймаутом.

Итак, вот рабочий код, который работает для вызова ссылок.

$url='http://example.com/';
$ch=curl_init();
$timeout=5;

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);

$result=curl_exec($ch);
curl_close($ch);
echo $result;
28
Randell

Стоит отметить, что при изменении default_socket_timeout на лету может быть полезно восстановить его значение после вашего вызова file_get_contents:

$default_socket_timeout = ini_get('default_socket_timeout');
....
ini_set('default_socket_timeout', 10);
file_get_contents($url);
...
ini_set('default_socket_timeout', $default_socket_timeout);
6
Pascal Roget

Для меня работа, когда я меняю свой php.ini на моем хосте:

; Default timeout for socket based streams (seconds)
default_socket_timeout = 300
1
Max