Rainer: URL auf "vorhandensein/funktion" prüfen

Hallo,

ich habe in einer Datenbanktabelle eine Spalte mit Links in der Form: http://example.com/irgendwas/nochwasanderes/?etc=1 usw.

Kann ich mittels PHP, soll dann mal ein Cronjob werden, prüfen ob die Links funktionieren? Wie geht das und mit welcher Funktion aus PHP kann man dies reaisieren?

Denkanstösse reichen mir. Mir fällt im Moment keine vernünftige Funktion ein.

Gruß Rainer

  1. Denkanstösse reichen mir. Mir fällt im Moment keine vernünftige Funktion ein.

    Mit fsockopen() oder mit cURL einen request absetzen und die HTTP-Antwort auswerten - bei 200 OK stehen die Chancen gut, dass die Seite funktioniert. Bei diversen anderen Status (z.B. 301) musst du ggf. anders reagieren und noch einen Request absetzen.

    1. Hallo,
      hier mal mein Test:

      $sql = "SELECT Link FROM tbl_presse ORDER BY ID";
      $res = mysql_query($sql);
      while($z = mysql_fetch_row($res)):
      $Link = str_replace("http://","",$z[0]);
      $fp = @fsockopen("$Link", 80, $errno, $errstr, 30);
      if (!$fp) {
           echo "NO / $Link<br />";
      }else{
      echo "OK / $Link<br />";
      }
      fclose($fp);
      endwhile;

      Das gibt aber nur NO aus. Muss ich da noch etwas an der Servereinstellung ändern?

      Auf meinen xampp gibt es wenigstens noch einige OK aus, wenn auch nicht alles stimmet, da ich manche Links mit NO durchaus "zu Fuss" aufrufen kann.
      Woran kann das liegen?

      Gruß Rainer

      1. Moin Moin!

        Hallo,
        hier mal mein Test:

        $sql = "SELECT Link FROM tbl_presse ORDER BY ID";
        $res = mysql_query($sql);
        while($z = mysql_fetch_row($res)):
        $Link = str_replace("http://","",$z[0]);
        $fp = @fsockopen("$Link", 80, $errno, $errstr, 30);
        if (!$fp) {
             echo "NO / $Link<br />";
        }else{
        echo "OK / $Link<br />";
        }
        fclose($fp);
        endwhile;

        
        > Das gibt aber nur NO aus.  
          
        [fsockopen()](http://php.net/manual/en/function.fsockopen.php) öffnet nur einen Socket. Du willst HTTP sprechen. Erschwerend kommt hinzu, dass fsockopen() als ersten Parameter keine verstümmelte URL, sondern einen Hostnamen erwartet.  
          
        Vielleicht fängst Du mal an, bei [http_get](http://www.php.net/manual/en/function.http-get.php) die PHP-Doku zu lesen, wenn Du HTTP nicht komplett von Null neu implementieren willst.  
          
        Alexander
        
        -- 
        Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
        
  2. Hi,

    ich habe in einer Datenbanktabelle eine Spalte mit Links in der Form: http://example.com/irgendwas/nochwasanderes/?etc=1 usw.
    Kann ich mittels PHP, soll dann mal ein Cronjob werden, prüfen ob die Links funktionieren?

    definiere "funktionieren".

    Reicht es dir zu wissen, dass unter dem angegebenen Hostnamen ein HTTP-Server werkelt? Dann genügt es, dich mit fsockopen() zu Port 80 des fraglichen Hosts zu verbinden. Ist der Host nicht erreichbar (oder antwortet niemand auf Port 80), wird fsockopen() fehlschlagen. Das merkst du am ungültigen Socket-Handle.

    Oder willst du sicherstellen, dass unter exakt der angegebenen URL eine Ressource abrufbar ist? Dann setze nach dem erfolgreichen Öffnen des Sockets noch einen HTTP-HEAD-Request ab. Bekommst du einen HTTP-Fehlercode (Nummern 4xx oder 5xx), kannst du die referenzierte Ressource wohl in den Wind schreiben, bei Statuscode 2xx oder 3xx kommt zumindest etwas Sinnvolles.

    So long,
     Martin

    --
    Wenn alle das täten, wass sie mich können,
    käme ich gar nicht mehr zum Sitzen.