Procédures pour effectuer une requête HEAD sur une URL.
Via socket pur (pas de SSL)
function check_url
($url){
$source = parse_url($url);
$address = gethostbyname($source['host']);
if ($source['port']) {
$port=$source['host'];
} else {
if ($source['scheme']=='http') {
$port=80;
} else {
error_log("Unsuported scheme : ".$source['scheme']);
return true;
}
}
$socket = fsockopen($address, 80, $errno, $errstr, broken_anchor_timeout
());
if (!$socket) {
return $errstr;
}
$request = "HEAD ".($source['path']==""?
"/":$source['path'])." HTTP/1.0\r\n";
$request .= "Host: ".$source['host']."\r\n";
$request .= "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.3) Gecko/2008092903 Mandriva/1.9.0.3-1mdv2009.0 (2009.0) Firefox/3.0.3\r\n";
$request .= "Connection: Close\r\n";
$request .= "\r\n";
stream_set_timeout($socket, broken_anchor_timeout
());
fputs($socket, $request);
$stream_errors = stream_get_meta_data($socket);
if ($stream_errors['timed_out']) {
return 'Writing timed out';
}
while (!feof($socket)) {
$return .= fgets($socket, 4096);
$stream_errors = stream_get_meta_data($socket);
if ($stream_errors['timed_out']) {
return 'Reading timed out';
}
}
fclose($socket);
$lines = @explode("\n",$return);
$status=trim(array_shift($lines));
$ipos=strpos($status, " ");
$status=substr($status, $ipos+1);
$ipos=strpos($status, " ");
$status=array(substr($status, 0, $ipos), substr($status, $ipos+1));
foreach($lines as $line) {
$line=trim($line);
if (strlen($line)>0) {
$iPos=strpos($line, ":");
if ($iPos!==false) {
$header[trim(substr($line, 0, $iPos))]=trim(substr($line, $iPos+1));
}
}
}
if (count($header)==0) {
return "No header received";
}
if ($status[0]==301) {
return broken_anchor_check_url
($header["Location"]);
}
if ($status[0]!=200 && $status[0]!=302) {
return $status[0]." ".$status[1];
}
return true;
}
- répondre
Dab, le 1 October, 2008 - 18:08Aller je ne peux m'empêcher ...
HEAD $url (du module lwp de Perl)
- répondre
Ulhume, le 1 October, 2008 - 23:56@Dab en effet, ça arrache
Ceci dit, tout est une question de librairies, pas de langages. Si j'utilisais php_curl, ça irait aussi beaucoup plus vite :
curl_setopt($ch, CURLOPT_NOBODY, TRUE);
curl_exec($ch));
Là l'intérêt était plus de garder pour mémoire la méthode "complète" en passant par les sockets.
- répondre
Dab, le 2 October, 2008 - 00:47Je suis bien daccord avec toi, Perl n'est rien sans le CPAN, en plus dans le cas précis il s'agit d'un script avec un tas d'options (ou même titre que GET ou POST)
- répondre
Ulhume, le 2 October, 2008 - 01:30@Dab moi ce qui me fascine, sociologiquement parlant, c'est à quel point ce langage peut passionner.
- répondre
Dab, le 2 October, 2008 - 23:41Pour ce qui me concerne, plutot par flegme. Je commence à peine à me débrouiller avec Perl et j'envisage pas de tout me retaper avec java/python ou autres. Perl me suffit
- répondre
Ulhume, le 3 October, 2008 - 00:04@Dab par flemme tu veux dire
Bah, y'a pas de bon langage de toute façon. Du moins j'ai jamais réussi à en trouver un qui me convienne pour tous les usages, ce serait trop simple je pense 
Poster un nouveau commentaire