2010-09-11 13 views
13
$url = 'http://a.url/i-know-is-down'; 

//ini_set('default_socket_timeout', 5); 

$ctx = stream_context_create(array(
    'http' => array(
     'timeout' => 5, 
     'ignore_errors' => true 
     ) 
    ) 
); 

$start = microtime(true); 
$content = @file_get_contents($url, false, $ctx); 
$end = microtime(true); 
echo $end - $start, "\n"; 

la respuesta que obtengo es generalmente de 21.232 segs, ¿no deberían ser unos cinco segundos?PHP file_get_contents ignorando el tiempo de espera?

Descomentar la línea ini_set no ayuda en absoluto.

+0

Podrías tratar de apagar tanto la bandera "ignore_errors", así como los @file_get_contents silenciosas() llamada y ver si surge algún error obvio? –

+0

@ Mahdi.M: No puedo desactivar 'ingnore_errors' porque necesito distinguir entre decir un error 404 y un error generado por problemas de conectividad. Déjame reformularlo. Si ingnore_errors' está desactivado y el servidor devuelve un contenido de $ 404, sería falso y necesito saber si $ contenido es falso debido a un error 404 o debido a un error de conectividad. El error que se muestra cuando suprimo @ el operador es genérico como 'file_get_contents (filename): no se pudo abrir la corriente' – Cesar

+2

Como regla general, nunca debería necesitar usar @. Si es crítico para su aplicación, es probable que lo escriba de la manera incorrecta. ¡No siempre, pero muy a menudo! –

Respuesta

13

Está configurando lea tiempo de espera con socket_create_context. Si la página que está intentando acceder no existe, el servidor le permitirá conectarse y le dará un 404. Sin embargo, si el sitio no existe (no se resolverá o no habrá servidor web detrás de él) , entonces file_get_contents() ignorará el tiempo de espera de lectura porque aún no ha agotado el tiempo de conexión.

No creo que pueda establecer el tiempo de espera de conexión en file_get_contents. Hace poco volvió a escribir algo de código para utilizar fsockopen() exactamente, ya que le permite especificar connect timeout

$connTimeout = 30 ; 
$fp = fsockopen($hostname, $port, $errno, $errstr, $connTimeout); 

Por supuesto que va a fsockopen será necesario que a continuación fread() de ella en un bucle, compicating su código ligeramente. Te da más control, sin embargo, en la detección de los tiempos de espera de lectura durante la lectura de ella usando stream_get_meta_data()

http://php.net/stream_get_meta_data