2009-10-09 14 views
8

Chciałbym wysłać polecenie HEAD protokołu hipertekstowego do serwera w PHP, aby pobrać nagłówek, ale nie treść lub adres URL. Jak zrobić to w skuteczny sposób?Jaki jest najłatwiejszy sposób użycia polecenia HEAD HTTP w PHP?

Prawdopodobnie najczęstszym przypadkiem jest sprawdzanie martwych łączy internetowych. Do tego potrzebuję tylko kodu odpowiedzi żądania HTTP, a nie treści strony. Uzyskiwanie stron internetowych w PHP można łatwo wykonać za pomocą file_get_contents("http://..."), ale w celu sprawdzenia linków, jest to naprawdę nieefektywne, ponieważ pobiera całą zawartość strony/obraz/cokolwiek.

Odpowiedz

15

Jako alternatywę do zwijania można użyć opcji kontekstowych http ustawić request method na HEAD. Następnie otwórz strumień (wrapper http) za pomocą tych opcji i pobierz metadane.

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

zobacz także:
http://docs.php.net/stream_get_meta_data
http://docs.php.net/context.http

+1

Preferuję to rozwiązanie nad tymi, które używają curl, ponieważ lubię używać wbudowanych funkcji. Może ktoś inny może wypowiedzieć się na temat skuteczności każdej możliwości? – fuenfundachtzig

+0

Należy zauważyć, że spowoduje to zgłoszenie błędu dla kodów odpowiedzi "401", a curl - rzeczywistą odpowiedź. –

+0

'stream_context_create()' może być również użyte z 'file_get_contents()'. Może 'get_headers()' jest znacznie lepiej połączone z 'stream_context_set_default()' z metodą żądania do HEAD. Zobacz http://php.net/manual/es/function.get-headers.php – cybmeta

17

Można to zrobić porządnie z 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

Nawet łatwiej niż curl - wystarczy użyć PHP get_headers() funkcję, która zwraca tablicę wszystkich informacji nagłówka dla dowolnego adresu URL można określić. Kolejnym łatwym sposobem sprawdzenia istnienia zdalnych plików jest użycie fopen() i próba otwarcia adresu URL w trybie odczytu (musisz włączyć allow_url_fopen).

Po prostu sprawdź instrukcję PHP dla tych funkcji, wszystko tam jest.

+1

'get_headers()' faktycznie wyśle ​​żądanie 'GET', chyba że zrobisz to najpierw: 'stream_context_set_default (array ('http' => array ('method' => 'HEAD'))); ' – Octopus

Powiązane problemy