2011-09-27 16 views
6

Hay un redireccionamiento al servidor para obtener información y una vez que la respuesta proviene del servidor, quiero verificar el código HTTP para lanzar una excepción si hay algún código que comience con 4XX. Para eso necesito saber cómo puedo obtener solo el código HTTP del encabezado? También aquí está involucrada la redirección al servidor, así que me temo que curl no me será útil.código de respuesta HTTP después de redirigir

Hasta ahora he intentado this solution pero es muy lento y crea tiempo de espera de script en mi caso. No quiero aumentar el tiempo de espera del script y esperar más solo para obtener un código HTTP.

Gracias de antemano por cualquier sugerencia.

+2

cURL puede seguir redirecciones bien. Puede leerlo en la documentación en lugar de temer sus suposiciones: http://php.net/manual/en/function.curl-setopt.php, busque 'CURLOPT_FOLLOWLOCATION' – Piskvor

+0

He intentado curl con la opción CURLOPT_FOLLOWLOCATION. Una cosa es buscar una página en mi servidor local y cuando ingreso el nombre de usuario/contraseña en la página que obtengo del servidor, el servidor se confunde en la redirección. ¿Cómo resolver esto? –

Respuesta

6

Algo así como:

$ch = curl_init(); 
    $httpcode = curl_getinfo ($ch, CURLINFO_HTTP_CODE); 

Usted debe tratar la Clase HttpEngine. Espero que esto ayude.

-

EDITAR

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_USERAGENT, $your_agent_variable); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_REFERER, $your_referer); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($ch, CURLOPT_TIMEOUT, 5); 
$output = curl_exec($ch); 
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
curl_close($ch); 

if ($httpcode ...) 
+0

lo siento, no estoy al tanto de la clase HttpEngine. ¿Me puede dar algo de información sobre eso? –

+0

No hay problema. Bueno, no recuerdo dónde conseguí esta clase ... Así que cargué ésta aquí: http://pastebin.ca/2083612 dime si necesitas ayuda. –

+0

Busqué en el archivo de la clase, pero no estoy seguro de cómo va a ayudar aquí. Utiliza curl y el uso de curl cuando hago que CURLOPT_FOLLOWLOCATION sea verdadero para redirigir, el método GET recupera toda la página. –

0

La solución que encontró ve bien. Si el servidor no puede enviarle los encabezados http a tiempo, su problema es que el otro servidor está roto o bajo una carga muy pesada.

8

Su método con get_headers y solicitando la primera línea de respuesta devolverá el código de estado del redireccionamiento (si lo hay) y lo más importante, que va a hacer una petición GET que transferir el archivo completo.

Solo necesita una solicitud HEAD y luego analizar los encabezados y devolver el último código de estado. Lo que sigue es un ejemplo de código que hace esto, se trata de utilizar $http_response_header en lugar de get_headers, pero el formato de la matriz es el mismo:

$url = 'http://example.com/'; 

$options['http'] = array(
    'method' => "HEAD", 
    'ignore_errors' => 1, 
); 

$context = stream_context_create($options); 

$body = file_get_contents($url, NULL, $context); 

$responses = parse_http_response_header($http_response_header); 

$code = $responses[0]['status']['code']; // last status code 

echo "Status code (after all redirects): $code<br>\n"; 

$number = count($responses); 

$redirects = $number - 1; 

echo "Number of responses: $number ($redirects Redirect(s))<br>\n"; 

if ($redirects) 
{ 
    $from = $url; 

    foreach (array_reverse($responses) as $response) 
    { 
     if (!isset($response['fields']['LOCATION'])) 
      break; 
     $location = $response['fields']['LOCATION']; 
     $code = $response['status']['code']; 

     echo " * $from -- $code --> $location<br>\n"; 
     $from = $location; 
    } 
    echo "<br>\n"; 
} 

/** 
* parse_http_response_header 
* 
* @param array $headers as in $http_response_header 
* @return array status and headers grouped by response, last first 
*/ 
function parse_http_response_header(array $headers) 
{ 
    $responses = array(); 
    $buffer = NULL; 
    foreach ($headers as $header) 
    { 
     if ('HTTP/' === substr($header, 0, 5)) 
     { 
      // add buffer on top of all responses 
      if ($buffer) array_unshift($responses, $buffer); 
      $buffer = array(); 

      list($version, $code, $phrase) = explode(' ', $header, 3) + array('', FALSE, ''); 

      $buffer['status'] = array(
       'line' => $header, 
       'version' => $version, 
       'code' => (int) $code, 
       'phrase' => $phrase 
      ); 
      $fields = &$buffer['fields']; 
      $fields = array(); 
      continue; 
     } 
     list($name, $value) = explode(': ', $header, 2) + array('', ''); 
     // header-names are case insensitive 
     $name = strtoupper($name); 
     // values of multiple fields with the same name are normalized into 
     // a comma separated list (HTTP/1.0+1.1) 
     if (isset($fields[$name])) 
     { 
      $value = $fields[$name].','.$value; 
     } 
     $fields[$name] = $value; 
    } 
    unset($fields); // remove reference 
    array_unshift($responses, $buffer); 

    return $responses; 
} 

Para obtener más información, véase: HEAD first with PHP Streams, en el extremo que contiene código de ejemplo de cómo se puede haga la solicitud HEAD con get_headers también.

relacionadas: How can one check to see if a remote file exists using PHP?

+0

Relacionado: [PHP: get_headers set temporary stream_context] (http://stackoverflow.com/questions/8429342/php-get-headers-set-temporary-stream-context) – hakre

Cuestiones relacionadas