andreas: Monitoring Script

Hallo!
Vor geraumer Zeit(ein paar Monate) habe ich schonmal nach einem Monitoring-Script gesucht, hab da aber nur Mist gefunden, und hier bekam ich zu hören " selbst schreiben.." naja, wie das einem am Anfang halt so geht:-)
Inzwischen traue ich mir das schon zu selbst zu schreiben, aber ich weiß dafür nicht so genau, was ich jetzt genau wie prüfen soll/kann.
Erstmal grundsätzlich will ich testen, ob der Webserver online ist, dann ob html Seiten und php Seiten mit 200 zurückgegeben werden, und wie es um mysql aussieht.
Das Script sollte natürlich auf einem möglichst sicheren, anderen Server liegen:-)
OK, soweit so gut.
Ich fange mal von hinten an, ist am einfachsten. SQL Datenbank mache ich einfach eine Abfrage auf und prüfe ob die erfolgreich war.
Dann php-Seiten und html Seiten, aufrufen, und prüfen, ob "200" zurückgegeben wird, nur wie mache ich das, und wie rufe ich aus php eine html Seite auf? php selbst könnte ich ja mit include machen, oder ging das auch nicht auf einen externen Webserver?
Hat jemand da Tipps für mich?
Wäre sehr nett!

Grüsse
  Andreas

  1. ich versteh nicht so ganz was du vor hast?

    1. Ich will einen Server sagen wir 1 mal pro Minute testen, ob php/html und mysql erreichbar sind und wenn nicht ne mail an mich oder sowas.

  2. Ich fange mal von hinten an, ist am einfachsten. SQL Datenbank mache ich einfach eine Abfrage auf und prüfe ob die erfolgreich war.

    So einfach wie hier funktioniert das nur, wenn auf dem zu testenden Server ein externen Zugriff auf die MySQL-Datenbank möglich ist. Ansonsten sicherlich die einfachste Möglichkeit.

    Dann php-Seiten und html Seiten, aufrufen, und prüfen, ob "200" zurückgegeben wird, nur wie mache ich das, und wie rufe ich aus php eine html Seite auf? php selbst könnte ich ja mit include machen, oder ging das auch nicht auf einen externen Webserver?

    Also wenn du HTML bzw. PHP Seiten testen willst ob du einen 200 Status-Code zurückbekommst wirst du dich direkt mit dem Server verbinden müssen (Stichwort fsockopen();). Dann die entsprechenden Seiten mit "GET /index.(html|php)" vom Server abrufen und dann musst du die Empfangenen Zeilen prüfen, ob eben 200 zurückgegeben wurde.

    Dieses Funktionsprinzip sollte funktionieren, wenn nicht möge man mich korrigieren.

    Servus
    Christian

    1. Ich fange mal von hinten an, ist am einfachsten. SQL Datenbank mache ich einfach eine Abfrage auf und prüfe ob die erfolgreich war.

      So einfach wie hier funktioniert das nur, wenn auf dem zu testenden Server ein externen Zugriff auf die MySQL-Datenbank möglich ist. Ansonsten sicherlich die einfachste Möglichkeit.

      Nun ja, kann gut sein, nach einem kurzen test eines Scriptes, welches auf dem Server anstandslos läuft, bekomme ich von meinem anderen Server aus keine Verbindung zur Datenbank, direkt mysql_connect() ist gescheitert. Was habe ich sonst für Möglichkeiten, das zu testen?

      Dann php-Seiten und html Seiten, aufrufen, und prüfen, ob "200" zurückgegeben wird, nur wie mache ich das, und wie rufe ich aus php eine html Seite auf? php selbst könnte ich ja mit include machen, oder ging das auch nicht auf einen externen Webserver?

      Also wenn du HTML bzw. PHP Seiten testen willst ob du einen 200 Status-Code zurückbekommst wirst du dich direkt mit dem Server verbinden müssen (Stichwort fsockopen();). Dann die entsprechenden Seiten mit "GET /index.(html|php)" vom Server abrufen und dann musst du die Empfangenen Zeilen prüfen, ob eben 200 zurückgegeben wurde.

      Und wie komme ich an die empfangenen Zeilen? Stehen die in bestimmten Variablen oder wie sieht das aus?

      Grüsse
        Andreas

    2. Moin

      Ich fange mal von hinten an, ist am einfachsten. SQL Datenbank mache ich einfach eine Abfrage auf und prüfe ob die erfolgreich war.
      So einfach wie hier funktioniert das nur, wenn auf dem zu testenden Server ein externen Zugriff auf die MySQL-Datenbank möglich ist. Ansonsten sicherlich die einfachste Möglichkeit.

      Nein, das möchtest du wirklich nicht tun, es sei denn du hast meinen Beitrag weiter unten nicht gelesen. http://forum.de.selfhtml.org/?m=23367&t=4111.

      Also die einfachste Methode ist dann sicherlich ein kleines Testskript auf einem Webserser hinter der Firewall abzulegen, welches dann deinem Monitor einfach nur ausgibt ob die Datenbank noch da ist, oder nicht.
      Wenn sogar der Webserver weg ist, dann bringt dir die Datenbank nämlich auch nichts mehr :)

      Zum Aufrufen externer Seiten finden sich reichlich Beispiele bei http://www.php.net/manual/de/function.fsockopen.php. Im Prinzip musst du nur ein fsockopen("www.webserver.de", 80) machen und das was du zurückkriegst wie eine Datei behandeln.
      Wenn du nur wissen willst, ob die Skriptdatei und der Webserver noch da sind, schreibst du dann "HEAD /deinskript.php HTTP/1.1\nHost: www.webserver.de\n\n" rein (ohne Anführungszeichen) und schaust ob etwas in der Art von "HTTP/1.1 200 OK" zurückkommt (+ ein bisschen mehr).
      Fehlerbehandlung (Verbindungsaufbau verweigert, Timeout, etc.) musst du natürlich noch extra machen.

      --
      Henryk Plötz
      Grüße aus Berlin

      1. Hi!

        Nein, das möchtest du wirklich nicht tun, es sei denn du hast meinen Beitrag weiter unten nicht gelesen. http://forum.de.selfhtml.org/?m=23367&t=4111.

        Hatte ich gelesen, aber es handelt sich hier um gehostete Webserver, wo ich auf sowas keinen Einfluß nehmen kann. Aber ich habe definitiv keinen Zugriff von extern. Ich meine jetzt nicht direkt auf die DB, sondern auch nicht über den Werbserver.(also vom Script aus)

        Wenn sogar der Webserver weg ist, dann bringt dir die Datenbank nämlich auch nichts mehr :)

        Hast Recht.

        Zum Aufrufen externer Seiten finden sich reichlich Beispiele bei http://www.php.net/manual/de/function.fsockopen.php. Im Prinzip musst du nur ein fsockopen("www.webserver.de", 80) machen und das was du zurückkriegst wie eine Datei behandeln.
        Wenn du nur wissen willst, ob die Skriptdatei und der Webserver noch da sind, schreibst du dann "HEAD /deinskript.php HTTP/1.1\nHost: www.webserver.de\n\n" rein (ohne Anführungszeichen) und schaust ob etwas in der Art von "HTTP/1.1 200 OK" zurückkommt (+ ein bisschen mehr).
        Fehlerbehandlung (Verbindungsaufbau verweigert, Timeout, etc.) musst du natürlich noch extra machen.

        Vielen Dank! Sowas hatte sich schon länger gesucht! Ich hab das jetzt mal so gemacht:

        <?
        $fp = fsockopen ("www.server.de", 80, &$errno, &$errstr, 30);
        if (!$fp) {
            echo "$errstr ($errno)<br>\n";
        } else {
        $fp2 = fputs ($fp, "HEAD /test/hallo.php HTTP/1.1\nHost: www.server.de\n\n");
            while (!feof($fp)) {
                echo fgets($fp,$fp2);
            }
            fclose($fp);
        }
        ?>

        echo fgets($fp,$fp2);
        kann ich das so machen, oder sollte da direkt die Zahl stehen?

        Das komische ist, dass das Script so etwa 10-20 Sekunden braucht - wofür, für das bischen was da zurück kommt!

        Eine 2. Version:

        <?
        $fp = fsockopen ("www.server.de", 80, &$errno, &$errstr, 30);
        if (!$fp) {
            echo "$errstr ($errno)<br>\n";
        } else {
        $fp2 = fputs ($fp, "HEAD /test/hallo.php HTTP/1.1\nHost: www.server.de\n\n");
                echo fgets($fp,$fp2);
        fclose($fp);
        }
        ?>

        Einfach nur die While Schleife weggelassen und das ganze dauert nur ein Sekunde und ich bekomme die Information, zum Glück "200"!

        Nochwas komisches, hab das so von php.net übernommen, aber wnn ich oben nur mal so einen falschen Server angebe, steht das nichts von Error... nur "(0)"
        Warum?

        Und die Nummer hole ich mir dann über den Substring?:

        $nr = substr (fgets($fp,$fp2), 9,3);

        Oder spricht was dagegen?
        Anhand der Nummer kann ich ja dann andere Aktionen einleiten!

        Jedenfalls vielen Dank bis jetzt!

        Grüsse
          Andreas

        PS: Welche Informationen wären wohl noch interessant, wenn man jetzt schonmal sowas macht?

        1. Moin

          echo fgets($fp,$fp2);
          kann ich das so machen, oder sollte da direkt die Zahl stehen?

          Ja, ok.

          Das komische ist, dass das Script so etwa 10-20 Sekunden braucht - wofür, für das bischen was da zurück kommt!

          Och, du hast dich verpflichtet HTTP 1.1 zu sprechen und da sind Keep-Alive Verbindungen glaubich Standard. Der Server wartet also noch einige Zeit bis er die Verbindung zumacht, für den Fall dass du noch was anderes haben möchtest. Füg einfach als zusätzlichen Header noch Connection: close hinzu und er sollte die Verbindung sofort zumachen.

          Nochwas komisches, hab das so von php.net übernommen, aber wnn ich oben nur mal so einen falschen Server angebe, steht das nichts von Error... nur "(0)"
          Warum?

          Äh, wenn ich mich recht erinnere stand das auf der Dokuseite zur fsockopen-Funktion oder zumdindest in den User-Comments: $errno und $errstr werden nur gesetzt, wenn der Fehler während des Verbindungsaufbaus auftrat (zum Beispiel "Verbindung verweigert"), nicht aber wenn er schon vorher auftritt, zum Beispiel wenn der Name nicht aufgelöst werden kann. Wenn du false zurückkriegst und $errno auf 0 gesetzt ist, kannst du also in der Regel von einem Nameserverfehler ausgehen. Ggbf. solltest du das noch überprüfen indem du selbst eine Nameserverabfrage startest (schauen ob http://www.php.net/manual/de/function.gethostbyname.php die IP-Addresse zurückgibt).

          Oder spricht was dagegen?

          Nicht wirklich. Im RFC steht allerdings man sollte tolerant sein, bei dem was man einliest. Also würde ich einen Regulären Ausdruck nehmen, der sich evt. auch von überschüssigen Leerzeichen oder anderem Gezeugs (ich hatte mal mit einem Webserver zu tun, der manchmal "HTTP 1 Apple" zurückgab :) verwirren lässt.

          PS: Welche Informationen wären wohl noch interessant, wenn man jetzt schonmal sowas macht?

          Hmm, kA, vielleicht wie lange Verbindungsaufbau und Antwort dauern als Maß für die Serverlast?

          --
          Henryk Plötz
          Grüße aus Berlin

  3. Hiho,

    Hat jemand da Tipps für mich?

    Willst Du _nur_ wissen, ob der Server online ist, oder ob auch wirklich die Seiten verfügbar sind. Dies ist ein großer Unterschied.

    Wenn Du nur wissen willst, ob der Server online ist, ping ihn doch einfach. Ein Skript, was diese Methode verwendet, findest Du unter http://www.osmodia.de (PHP-Section - Onlinestatus oder so ähnlich).

    Das pingen hat ein paar Vorteile gegenüber der 200 Abfrage, aber natürlich auch Nachteile. So geht z.B. ein Ping schneller, verursacht weniger Server- und Trafficlast, nur erhälst Du eben keine konkrete Auskunft darüber, ob spezielle Services oder Seiten auf dem Server verfügbar sind.

    Viele Grüße...

    Alex :)

    1. Hi!
      Ich hab die Erfahrung gemacht, dass der Server zwar fqast immer online ist(daher die Super Statistik) Aaber viel öfter die Seiten selbst nicht erreichbar sind, sei es das die was an den Namensservern, oder den Virtuellen hosts... jedenfalls liegen da die Probleme, nicht beim Server. Und da das schwieriger nachzuprüfen ist, können die ja gut behaupten 99,xx% Garantie....
      Aber weißt Du denn, wie ich in php einen PING sende, und das Ergenbis in eine Variable schreibe?
      Grüsse
        Andreas