Установлен ли параметр_пакеты_файла() в параметре timeout?

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

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

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

Ответ 1

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

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

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

Ответ 2

Как отмечалось в @diyism, "default_socket_timeout, stream_set_timeout и time_timetext_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;

Ответ 3

Стоит отметить, что при изменении 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);

Ответ 4

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

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