Requête HEAD en PHP
Le 1 octobre 2008, à 11:46 par Ulhume...

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;
}

Commentaires

Dab, le 1 October, 2008 - 18:08

Aller je ne peux m'empêcher ...
HEAD $url (du module lwp de Perl)

Ulhume, le 1 October, 2008 - 23:56

@Dab en effet, ça arrache Smiling Ceci dit, tout est une question de librairies, pas de langages. Si j'utilisais php_curl, ça irait aussi beaucoup plus vite :

$ch = curl_init($url);
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.

Dab, le 2 October, 2008 - 00:47

Je 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)

Ulhume, le 2 October, 2008 - 01:30

@Dab moi ce qui me fascine, sociologiquement parlant, c'est à quel point ce langage peut passionner.

Dab, le 2 October, 2008 - 23:41

Pour 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 Smiling

Ulhume, le 3 October, 2008 - 00:04

@Dab par flemme tu veux dire Wink 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 Wink

Poster un nouveau commentaire

Le contenu de ce champ est gardé secret et ne sera pas montré publiquement.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • To highlight piece of code, just surround them with <code type="language"> Your code &tl;/code>>. Language can be java,c++,bash,etc... Everything Geshi support.
  • Les lignes et les paragraphes vont à la ligne automatiquement.
  • Textual smileys will be replaced with graphical ones.
  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.

Plus d'informations sur les options de formatage

Connexion utilisateur
Les derniers bavardages...