2009-10-09 5 views
8

Vorrei inviare il comando HEAD di Hypertext Transfer Protocol a un server in PHP per recuperare l'intestazione, ma non il contenuto o un URL. Come faccio a farlo in modo efficiente?Qual è il modo più semplice per utilizzare il comando HEAD di HTTP in PHP?

Il caso di utilizzo più comune è quello di verificare la presenza di collegamenti Web non funzionanti. Per questo ho solo bisogno del codice di risposta della richiesta HTTP e non del contenuto della pagina. Ottenere pagine Web in PHP può essere fatto facilmente usando file_get_contents("http://..."), ma ai fini del controllo dei collegamenti, questo è davvero inefficiente in quanto scarica l'intera contenuto della pagina/immagine/qualsiasi cosa.

risposta

15

Come alternativa ad arricciarsi è possibile utilizzare le opzioni di contesto http per impostare la metodo di richiesta a HEAD. Quindi apri un flusso (http wrapper) con queste opzioni e recupera i metadati.

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

vedi anche:
http://docs.php.net/stream_get_meta_data
http://docs.php.net/context.http

+1

Preferisco questa soluzione rispetto a quelle che usano curl, perché mi piace usare le funzioni integrate. Forse qualcun altro può commentare le prestazioni di ogni possibilità? – fuenfundachtzig

+0

Si noti che questo genera un errore per i codici di risposta '401', mentre arricciamento fornisce la risposta effettiva. –

+0

'stream_context_create()' può essere usato anche con 'file_get_contents()'. Forse 'get_headers()' è molto meglio combinato con 'stream_context_set_default()' al metodo della richiesta a HEAD. Vedi http://php.net/manual/es/function.get-headers.php – cybmeta

17

Si può fare questo perfettamente 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

ancora più facile di curl - basta usare la funzione PHP get_headers() che restituisce un array di tutte le informazioni di intestazione per qualsiasi URL specificato. E un altro vero e semplice modo per verificare la presenza di file remoti è usare fopen() e provare ad aprire l'URL in modalità lettura (per questo dovrai abilitare allow_url_fopen).

Basta controllare il manuale PHP per queste funzioni, è tutto lì dentro.

+1

'get_headers()' invierà effettivamente una richiesta 'GET' a meno che non lo facciate prima: 'stream_context_set_default (array ('http' => array ('metodo' => 'HEAD'))); ' – Octopus