Benutzer-Werkzeuge


Prüfen von URLs mit PHP

Oft hat man eine Datenbank voller URLs (z.B. von RSS Feeds oder Linklisten). Diese wachsen mit der Zeit immer mehr und dabei noch den Überblick zu behalten welche URLs noch gültig sind ist ziemlich schwierig. Um meine RSS URLs zu prüfen habe ich folgende PHP Funktion geschrieben

<?php
function checkURL($url){
  $url = parse_url($url);
  $fp = fsockopen($url['host'],80);
  if($fp === false){
    return false;
  }
  $ret = array();
  $out = "HEAD {$url['path']} HTTP/1.1\r\n";
  $out .= "Host: {$url['host']}\r\n";
  $out .= "Connection: Close\r\n\r\n";
  fwrite($fp, $out);
  while (!feof($fp)) {
   $ret[] = fgets($fp, 128);
  }
  fclose($fp);
  if(strpos($ret[0],"200 OK") !== false){
    return true;
  }else{
    if(strpos($ret[0],"301") !== false || strpos($ret[0],"302") !== false){
      foreach($ret as $wert){
        if(strpos($wert,"Location: http://") !== false){
          $wert = trim(str_replace("Location:",'',$wert));
          return $wert;
        }
      }
      return false;
    }
  }
  return false;
}

Die Funktion erwartet eine komplette URL d.h. inklusive Schema und Pfad. Ansonsten fällt parse_url() auf die Schnauze. Danach baut die Funktion eine Socketverbindung zu Port 80 des Hosts auf und versucht einen HEAD-Request nach dem File. HEAD-Requests sind in solchen Fällen zu bevorzugen, da man eigentlich nur den Status des Servers aus der Antwort heraus braucht (GET würde hingegen auch die Inhaltsdaten des Files „verlangen“). Die Funktion gibt TRUE zurück, wenn der Server einen Status 200 OK für die Ressource gemeldet hat. Sollte der Server mit HTTP Status 301 oder 302 antworten wird die Antwort auf die neue URL hin untersucht. Wenn diese in der Antwort gefunden werden konnte, dann gibt die Funktion diese URL zurück. Sollte der Server mit 404 antworten, einem x-beliebigen anderen Status oder wenn keine Socketverbindung aufgebaut werden konnte, dann gibt die Funktion FALSE zurück

Melden Sie sich an, um einen Kommentar zu erstellen.

Seiten-Werkzeuge