Я вызываю серию ссылок, используя метод file_get_contents()
в цикле. Для обработки каждой ссылки может потребоваться более 15 минут. Теперь, я беспокоюсь о том, имеет ли PHP file_get_contents()
период ожидания?
Если «да», он отключится с вызовом и перейдет к следующей ссылке. Я не хочу вызывать следующую ссылку без предварительной обработки.
Итак, скажите, пожалуйста, имеет ли file_get_contents()
период ожидания. Файл, который содержит file_get_contents()
, установлен в значение set_time_limit()
равным нулю (неограниченно).
Тайм-аут по умолчанию определяется параметром default_socket_timeout
, который составляет 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);
Как упоминалось в @diyism, « default_socket_timeout, stream_set_timeout и stream_context_create timeout – это все тайм-аут каждой строки чтения / записи, а не весь тайм-аут соединения ». И главный ответ by @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_CONNECTTIMEOUT, $timeout); $result=curl_exec($ch); curl_close($ch); echo $result;
Стоит отметить, что при изменении 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);
Для меня работает, когда я меняю свой php.ini на моем хосте:
; Default timeout for socket based streams (seconds) default_socket_timeout = 300