2009-10-09 10 views
8

Je voudrais envoyer la commande HEAD du protocole de transfert hypertexte à un serveur en PHP pour récupérer l'en-tête, mais pas le contenu ou une URL. Comment puis-je le faire de manière efficace?Quel est le moyen le plus simple d'utiliser la commande HEAD de HTTP en PHP?

Le cas d'utilisation probablement le plus courant consiste à vérifier les liens Web morts. Pour cela, j'ai seulement besoin du code de réponse de la requête HTTP et non du contenu de la page. Obtenir des pages Web en PHP peut être fait facilement en utilisant file_get_contents("http://..."), mais dans le but de vérifier les liens, c'est vraiment inefficace car il télécharge le contenu de la page entière/image/peu importe.

Répondre

15

Comme alternative à friser, vous pouvez utiliser les options de contexte HTTP pour définir la demande la méthode à HEAD. Ensuite, ouvrez un flux (http wrapper) avec ces options et récupérez les méta-données.

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

voir aussi:
http://docs.php.net/stream_get_meta_data
http://docs.php.net/context.http

+1

Je préfère cette solution à celles qui utilisent curl, parce que j'aime utiliser les fonctions intégrées. Peut-être que quelqu'un d'autre peut commenter sur la performance de chaque possibilité? – fuenfundachtzig

+0

Notez que cela provoquera une erreur pour les codes de réponse '401', alors que curl vous fournira la réponse réelle. –

+0

'stream_context_create()' peut aussi être utilisé avec 'file_get_contents()'. Peut-être que 'get_headers()' est bien mieux combiné avec 'stream_context_set_default()' à la méthode de la requête à HEAD. Voir http://php.net/manual/es/function.get-headers.php – cybmeta

17

Vous pouvez le faire parfaitement avec 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

encore plus facile que boucle - il suffit d'utiliser la fonction PHP get_headers() qui retourne un tableau de toutes les informations d'en-tête pour toutes les URL que vous spécifiez. Et un autre moyen très simple de vérifier l'existence d'un fichier distant est d'utiliser fopen() et d'essayer d'ouvrir l'URL en mode lecture (vous devrez activer allow_url_fopen pour cela).

Il suffit de consulter le manuel PHP pour ces fonctions, tout est là.

+1

'get_headers()' enverra une requête 'GET' à moins que vous ne le fassiez en premier: 'stream_context_set_default (array ('http' => array ('method' => 'HEAD'))) – Octopus

Questions connexes