2009-10-09 6 views
8

Ich möchte den Befehl HEAD des Hypertext Transfer Protocol an einen Server in PHP senden, um den Header, aber nicht den Inhalt oder eine URL abzurufen. Wie mache ich das auf effiziente Weise?Was ist der einfachste Weg, den HEAD-Befehl von HTTP in PHP zu verwenden?

Der wahrscheinlich häufigste Anwendungsfall ist die Suche nach toten Weblinks. Dazu benötige ich nur den Antwortcode der HTTP-Anfrage und nicht den Seiteninhalt. Das Erhalten von Webseiten in PHP kann einfach mit file_get_contents("http://...") durchgeführt werden, aber zum Überprüfen von Links ist dies wirklich ineffizient, da es den ganzen Seiteninhalt/Bild/was auch immer herunterlädt.

Antwort

15

Als Alternative zu locken Sie die http Kontextoptionen verwenden können, die festlegen Anfrage-Methode zu HEAD. Öffnen Sie dann mit diesen Optionen einen Stream (http-Wrapper) und rufen Sie die Metadaten ab.

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

siehe auch:
http://docs.php.net/stream_get_meta_data
http://docs.php.net/context.http

+1

Ich bevorzuge diese Lösung gegenüber denen mit Curl, weil ich gerne integrierte Funktionen verwenden. Vielleicht kann jemand anderes die Leistung jeder Möglichkeit kommentieren? – fuenfundachtzig

+0

Beachten Sie, dass dies einen Fehler für die Antwortcodes "401" verursacht, während curl Ihnen die tatsächliche Antwort liefert. –

+0

'stream_context_create()' kann auch mit 'file_get_content()' verwendet werden. Vielleicht ist 'get_headers()' viel besser mit 'stream_context_set_default()' zu der Methode der Anfrage an HEAD kombiniert. Siehe http://php.net/manual/es/function.get-headers.php – cybmeta

17

Sie können dies mit cURL ordentlich tun:

<?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

Noch einfacher als curl - nur die get_headers() Funktion PHP benutzen, die für jede URL ein Array aller Header-Informationen liefert die Sie angeben. Und eine andere einfache Möglichkeit, um das Vorhandensein von Remote-Dateien zu überprüfen, ist die Verwendung von und versuchen, die URL im Lesemodus zu öffnen (Sie müssen hierfür allow_url_fopen aktivieren).

Schauen Sie sich einfach das PHP-Handbuch für diese Funktionen an, es ist alles drin.

+1

'get_headers()' wird tatsächlich eine 'GET' Anfrage senden, wenn Sie dies zuerst tun: 'stream_context_set_default (array ('http' => Array ('Methode' => 'HEAD'))). ' – Octopus