2012-04-19 17 views
113

Llamo a una serie de enlaces utilizando el método file_get_contents() en un bucle. Cada enlace puede tardar más de 15 minutos en procesarse. Ahora, me preocupa si PHP file_get_contents() tiene un período de tiempo de espera?¿File_get_contents() tiene una configuración de tiempo de espera?

En caso afirmativo, se cerrará con una llamada y pasará al siguiente enlace. No quiero llamar al siguiente enlace sin el anterior.

Por lo tanto, dígame si file_get_contents() tiene un período de tiempo de espera. El archivo que contiene file_get_contents() se establece en set_time_limit() en cero (ilimitado).

+0

Referencia cruzada: [Manipulación retrasos al recuperar archivos desde un servidor remoto en PHP] (http://stackoverflow.com/q/1605063/367456) – hakre

+0

Experimenté el mismo comportamiento (tiempo de espera al consultar URL en el mismo "servidor") dentro de un proyecto PHP de Visual Studio que usa las herramientas PHP para Visual Extensiones de estudio. [Más información aquí] (http://support.devsense.com/viewtopic.php?f=21&t=1916). –

+0

Esto ocurre también cuando se utiliza el [servidor PHP integrado para consultar una URL en el mismo sitio web] (https://bugs.php.net/bug.php?id=63102), porque es una red de subproceso único servidor. –

Respuesta

225

El tiempo de espera predeterminado está definido por default_socket_timeout ini-setting, que es 60 segundos. También puede cambiar sobre la marcha:

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

Otra forma de establecer un tiempo de espera, sería utilizar stream_context_create para establecer el tiempo de espera como HTTP context options del HTTP stream wrapper en uso:

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

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

¿Puede darnos información sobre cómo configurar el tiempo de espera para https url? – Vinay

+8

esto no funciona a la perfección, si su valor es 1200, en realidad es 2400. simplemente lo pruebo. – TomSawyer

+13

default_socket_timeout, stream_set_timeout y stream_context_create timeout son todo el tiempo de espera de cada línea de lectura/escritura, no todo el tiempo de espera de conexión. – diyism

22

Como @diyism mencionado, "default_socket_timeout, stream_set_timeout y stream_context_create timeout son todo el tiempo de espera de cada línea de lectura/escritura, no todo el tiempo de espera de conexión." Y la respuesta principal de @stewe me ha fallado.

Como alternativa al uso de file_get_contents, siempre puede usar curl con un tiempo de espera agotado.

Así que aquí hay un código de trabajo que funciona para llamar a enlaces.

$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; 
+1

Esta respuesta ofrece otro enfoque para controlar el tiempo de espera de conexión (utilizando 'fsockopen' en lugar de' curl'): http://stackoverflow.com/a/3690321/1869825 – stevo

+1

debe establecer tanto CURLOPT_CONNECTTIMEOUT como CURLOPT_TIMEOUT en curl. Ver http://stackoverflow.com/a/27776164/1863432 – bhelm

1

Para mi trabajo cuando cambio mi php.ini en mi anfitrión:

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

Vale la pena señalar que si el cambio de default_socket_timeout sobre la marcha, que podría ser útil para restablecer su valor después de sus file_get_contents de llamadas:

$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); 
Cuestiones relacionadas