• [PHP] [Codeschnipsel] Überprüfen, ob eine Website erreichbar ist

    Aufgrund dieses Thread's habe ich eine simple Funktion geschrieben, die überprüft, ob eine Website verfügbar bzw. erreichbar ist.

    Erreichbar heißt in diesem Sinne, ob man als normaler Nutzer auf die Website zugreifen kann.
    Wir nutzen dazu die PHP-Funktion fsockopen(), um zu überprüfen, ob eine Verbindung zur Website hergestellt werden kann.
    Um sicher zu stellen, dass auch wirklich ein Nutzer die Index-Seite ansehen kann, machen wir von der Funktion fwrite() Gebrauch, indem wir einen GET-Request schicken.

    Funktion:
    Code php:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    
    <?php 
      /**
       * @author ComFreek http://www.tutorials.de/members/comfreek.html
       * @license Free software but if you like this code snippet, you can make a link!  
       * http://www.tutorials.de/members/comfreek.html    
       */     
      
      /** 
       * Checks if a website or file is available 
       * @param string $WebsiteURL The website URL or file to check
       * @param boolean $GETRequest='true' If you pass TRUE, a GET request will also be made
       * @param int $Port='80' The port to use in fsockopen()
       * @param $Timeout='5' The timeout in seconds to use in fsockopen()         
       * 
       * @return boolean Returns TRUE if the handle of fsockopen() (if $GETRequest=true and fwrite()) was valid
       * 
       * @uses fsockopen()         
       * @uses fwrite()
       * @uses fclose()   
       */      
      function WebsiteAvailable($WebsiteURL, $GETRequest=true, $Port=80, $Timeout=5) 
      { 
        $ErrorNumber = NULL;
        $ErrorMessage = "";
        $FileHandle = @fsockopen($WebsiteURL, $Port, $ErrorNumber, $ErrorMessage, $Timeout);
        if ($FileHandle)
        {
          if ($GETRequest)
          {
            $HTTPString = "GET / HTTP/1.1\r\n";
            $HTTPString .= "Host: ".$WebsiteURL."\r\n";
            $HTTPString .= "Connection: Close\r\n\r\n";
          
            $WrittenBytes = @fwrite($FileHandle, $HTTPString);
            fclose($FileHandle);
            if ($WrittenBytes>0)
              return true;
            else
              return false;      
          }   
          fclose($FileHandle); 
          return true; 
        } 
        else 
        { 
          return false; 
        } 
      }
    ?>

    Hinweis: Ihr müsst den Präfix http:// weglassen!
    Ihr könnt aber auch eine SSL-Verbindung mit dem Präfix ssl:// oder TLS-Verbindung herstellen. Ein Blick in das PHP-Manual lohnt sich auf jeden Fall!

    Hinweis: Ihr könnt ssl:// und tls:// nur nutzen, wenn OpenSSL mit einkompiliert wurde!

    Der erste Parameter enthält die URL ohne jede weitere Verzeichnisstrukturen oder Dateiangaben! z.B. www.google.de
    Der zweite Parameter bestimmt, ob ein GET-Request zusätzlich zu fsockopen() ausgeführt werden soll.
    Der dritte Parameter bestimmt den Port.
    Und der vierte Parameter gibt das Timeout in Sekunden an.



    Beispiele:
    PHP-Code:
    # Nur mit benötigten Parametern
    # Mit GET-Request, 80 als Portnummer und 5 Sekunden als Timeout
    var_dump(  WebsiteAvailable("www.google.de")  );

    # Mit GET-Request, 80 als Portnummer und 10 Sekunden als Timeout
    var_dump(  WebsiteAvailable("www.example.invalid"), true8010); 


    # SSL-Verwendung
    var_dump(  WebsiteAvailable("ssl://www.example.com")  ); 
    Ich hoffe, die Funktion wird für jemanden nützlich sein!
    Falls Ihr einen Verbesserungsvorschlag oder andere Anregungen habt, postet doch einen Kommentar!

    Außerdem Danke an Felix Jacobi und Bratkartoffel für die Verbesserungsvorschläge!
     


     
    Kommentare 3 Kommentare
    1. Avatar von Flex
      Flex -
      Das Problem daran ist, dass es keine 100%ige Methode ist.
      Wenn die Domain nicht existiert, springt eventuell ein Provider ins Feld. Bei mir z. B. ergibt die Funktion immer true, weil die Telekom mir dann ihre Suchmaschine präsentiert. Noch dazu läuft fopen() solange bis es zum Timeout kommt. Was schon mal lange dauern kann.

      Diese Probleme treten bei fsockopen() nicht auf. Es prüft direkt, braucht keine etwaige Änderung der Ini Einstellungen, der Timeout lässt sich einstellen und etwaige DNS Fänger treten nicht auf.
    1. Avatar von Bratkartoffel
      Bratkartoffel -
      Hallo,

      würde hier noch einen GET-Request absetzen und schauen was der Server für einen HTTP-Statuscode zurückgibt.
      Es kann ja auch sein, dass ein Internal-Server-Error vorliegt.

      Gruß
      BK
    1. Avatar von ComFreek
      ComFreek -
      Hallo!
      Danke für die Kommentare. Stimmt eigentlich, dass fopen() nicht die beste Wahl war.

      Ich werde mal die Funktion umbauen...

      Edit: Der Artikel wurde aktualisiert!