Установлен ли параметр_пакеты_файла() в параметре 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