2009-10-09 9 views
8

Me gustaría enviar el comando HEAD del Protocolo de transferencia de hipertexto a un servidor en PHP para recuperar el encabezado, pero no el contenido o una URL. ¿Cómo hago esto de una manera eficiente?¿Cuál es la forma más fácil de usar el comando HEAD de HTTP en PHP?

El caso de uso probablemente más común es comprobar si hay enlaces web muertos. Para esto solo necesito el código de respuesta de la solicitud HTTP y no el contenido de la página. Obtener páginas web en PHP se puede hacer fácilmente usando file_get_contents("http://..."), pero con el propósito de verificar enlaces, esto es realmente ineficiente ya que descarga toda la página contenido/imagen/lo que sea.

Respuesta

15

Como una alternativa para rizar puede utilizar las opciones de contexto http para establecer el método de solicitud al HEAD. A continuación, abra una secuencia (http wrapper) con estas opciones y obtenga los metadatos.

$context = stream_context_create(array('http' =>array('method'=>'HEAD'))); 
$fd = fopen('http://php.net', 'rb', false, $context); 
var_dump(stream_get_meta_data($fd)); 
fclose($fd); 

ver también:
http://docs.php.net/stream_get_meta_data
http://docs.php.net/context.http

+1

Prefiero esta solución que las que usan curl, porque me gusta usar las funciones incorporadas. ¿Tal vez alguien más puede comentar sobre el desempeño de cada posibilidad? – fuenfundachtzig

+0

Tenga en cuenta que esto generará un error para los códigos de respuesta '401', mientras que curl le proporciona la respuesta real. –

+0

'stream_context_create()' se puede usar también con 'file_get_contents()'. Tal vez 'get_headers()' esté mucho mejor combinado con 'stream_context_set_default()' al método de la solicitud al HEAD. Consulte http://php.net/manual/es/function.get-headers.php – cybmeta

17

Usted puede hacer esto perfectamente con cURL:

<?php 
// create a new cURL resource 
$ch = curl_init(); 

// set URL and other appropriate options 
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/"); 

// This changes the request method to HEAD 
curl_setopt($ch, CURLOPT_NOBODY, true); 

// grab URL and pass it to the browser 
curl_exec($ch); 

// Edit: Fetch the HTTP-code (cred: @GZipp) 
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE); 

// close cURL resource, and free up system resources 
curl_close($ch); 
3

Incluso más fácil de rizo - sólo tiene que utilizar la función de PHP get_headers() que devuelve una matriz de toda la información de cabecera para cualquier URL que especifique. Y otra manera muy fácil de verificar la existencia de archivos remotos es usar fopen() e intentar abrir la URL en modo lectura (deberá habilitar allow_url_fopen para esto).

Solo echa un vistazo al manual de PHP para estas funciones, está todo allí.

+1

'get_headers()' enviará una solicitud 'GET' a menos que haga esto primero: 'stream_context_set_default (array ('http' => array ('método' => 'HEAD'))); ' – Octopus

Cuestiones relacionadas