PHP Servermonitoring

te one

Lt. Commander
Registriert
Apr. 2009
Beiträge
1.255
Hallo,
leider kann man unter cronjob.de keine Servermonitoring-Aufträge mehr kostenlos erstellen.

Nun habe ich mir überlegt ob ich mir vielleicht selbst soetwas programmieren könnte (Kenntnisse eigentlich einige vorhanden).
Jetzt aber erstmal grundlegend einige Fragen:
1. Kennt ihr andere Servermonitoring seiten (kostenlos!)?
2. Funktioniert das ganze auch wenn nur die Datenbank offline ist? (Wenn also vom Webserver ein error kommt dass database down ist)
3. Was haltet ihr vom der überlegung die gleich folgt?

Was meine Überlegung war:
Eine normale überprüfung ob der webserver erreichbar ist reicht nicht, da es wahrscheinlich nicht meldet wenn die datenbank offline ist.
also dachte ich, ich mach eine html seite auf der einfach nur "Online" steht.
Außerdem mach ich ne extra Tabelle in meiner mySQL-Datenbank in der zB auch einfach "Online" in nem Feld steht.
Nun lasse ich per Cronjob einmal am tag diese seiten aufrufen und überprüfen ob auf beiden Seiten ein "Online" steht. Wenn ja ist alles gut wenn nicht dann bekomm ich ne fehlermeldung per mail.

Wie liese sich diese Idee verwirklichen? Die Mail senden ist schonmal kein Problem da ich schon einige E-Mail verteiler geprogt habe!
Doch weiß jemand von euch, wie ich das hinbringe zu prüfen ob ein "Online" auf der seite steht?? (möglicherweiße die seiten in frames öffnen und dann prüfen? Oder irgendwie seitenquelltext öffnen und durchsuchen)?

Es wäre sehr nett wenn ihr mir helfen würdet.
(Besonders schön wäre es, wenn ich sowas mit eurer hilfe dann selbstprogrammieren könnte)


mfg
te one

edit: Ich habe soeben ein ganz einfach Skript gefunden. Das überprüft anscheinend aber nur, ob der Server erreichbar ist. Und ich behaupte mal, dass er dann also nichts merkt, wenn die Datenbank nicht erreichbar ist!
In diesem Skript wird durch
if(@fsockopen($ip,$port,$errno,$errstr,1))
Überprüft ob er antwortet (meine it-kenntnisse sagen mir, dass dieser befehl wahrscheinlich ein socket öffnet um mit dem server zu kommunizieren?! kenn mich aber hier noch nicht sehr gut aus, über eine aufklärung wäre ich sehr dankbar)
 
Zuletzt bearbeitet:
hmm wie gut sind denn deine kenntnisse wenn du das skript schon nicht verstehst?
deine datenbank kannst du zB so überprüfen indem du dir ein php script schreibst welches einfach nur versucht eine connection zur datenbank zu öffnen, wenn dies scheitert ist die DB halt down.
 
hm stimmt...ok nur ist es möglich von jedem webspace auf die datenbank zu connecten? dachte immer das das nur von dem dazugehörenden webspace funktioniert?!

und webspaceverfügbarkeit prüfe ich dann mit dem unten genannten befehl oder gibts bessere möglichkeiten?

ps: Ich kann auch einfach bei selfphp oder so den befehl eingeben und mir dort die beschreibung durchlesen und dann sagen..."OK, ich habs verstanden"
Aber mir geht es nunmal darum das richtig zu verstehen. Aber ich denke ich habs eh verstanden da ich erst gestern nen vortrag dadrüber angehört hab und mir jetzt nochmal beschreibung davon durchgelesen hab.
 
dachte immer das das nur von dem dazugehörenden webspace funktioniert?!
Hängt von den Einstellungen des Providers ab.
Die etwas sicherheitsbewussten, erlauben es nur vom localhost aus zu öffnen.

Probier dein Skript doch aus. Einige Prodiver (aber nicht alle) verbieten externe Abfragen. {meiner Gottseidank nicht).
 
hm dann probier ich erstmal mein script bei mir aufm rechner (mit xampp oder so da anderer server grad nicht angeschlossen ist)
Dann mal auf meinem anderen webspace.

Das problem ist dass ich demnächst auf nen kostenpflichtigen hoster umsteigen will. da muss ich gleich mal schauen ob das erlaubt ist.
ich seh da jetzt leider nichts was darauf hinweißt ob geht oder nicht. aber ich denke mal eher nicht.

aber es ist dann normalerweiße doch möglich nen script aufn webserver zu legen der dann zB in ne variable schreibt, dass er auf die DB drauf kommt und ich dann von nem externen script auf die variable komm?! (wie kann ich ne solche variable machen und drauf zugreifen?)

edit: hm schon ewig nixmehr programmiert, deshalb kommt man einfach nixmehr so schnell auf alles...
ich include einfach in nem externen script ein andere script das auf dem server direkt liegt.
Auf dem internen script connecte ich auf die DB und wenn das klappt wird ne variable wahr und dadurch zeigt meine seite an dass die DB online ist.
Sollte eigentlich funktionieren
Ergänzung ()

so auf meinem xammp-server gehts einigermasen:

webspacecheck.php
PHP:
<?php
$webspace=0;
$database=0;
include 'databasecheck.php';
$fp = fsockopen("localhost", 80, $errno, $errstr, 30);
if (!$fp) {
    echo 'Webspace not reachable!';
    $webspace=0;
} else {
    echo 'Webspace L&Auml;UFT!';
    $webspace=1;
    }
    fclose($fp);
    
    echo 'DATABASE:'.$databasecheck.'!';
    
?>

und hier die databasecheck.php
PHP:
<?php
$databasecheck=0;

$mysqlhost='localhost'; // MySQL-Host angeben
$mysqluser='root'; // MySQL-User angeben
$mysqlpwd=''; // Passwort angeben
$mysqldb='test'; //Gewuenschte Datenbank angeben

$connection=mysql_connect( $mysqlhost, $mysqluser, $mysqlpwd);

mysql_select_db( $mysqldb, $connection);

if ($connection) {
echo 'GEHT!';
$databasecheck=1;
}
elseif (!$connection) {
echo 'GEHT NICHT!';
}

mysql_close($connection);
?>

So jetzt bekomme ich auch, wenn webspace + datenbank online sind ne schöne antwort (mach ich dann halt so dass es mir ne mail sendet!)
Wenn der Webspace nicht online ist, ist mir natürlich klar das das script nicht funktioniert^^ (wenns halt aufm selben server ist)
Nur wie mache ich das jetzt, dass er mir nicht mein script abbricht wenn er keine connection zur datenbank bekommt? (sowas wie errors off oder so, dass er halt alles einfach weiterausführt)

Danke schonmal.
 
Zuletzt bearbeitet:
du willst die ausgabe von mysql_connect unterdrücken? schreib ein @ davor, also $connection = @mysql_connect(...)
 
vielen dank :)
ich denke mit dem wissen bring ich dann den rest auch ganz gut zustande. muss leider noch ein bisschen lernen aber nacher werd ichs gleich mal testen.

mfg und danke
te one
 
so ich benötige nochmal einen denkanstos von euch :)

ich habe nun dass problem dass auf server a ein script liegt, das testet ob port 80 auf server b erreichbar ist und das script von server b included. auf server b liegt ein script dass auf seine eigene Datenbank zugreift und prüft ob sie erreichbar ist.
Nun habe ich folgendes Problem: Ich möchte das script auf server a ausführen und dann sehen ob webspace und Datenbank erreichbar sind. Leider werden variablen von server b nicht mitincluded weshalb ich das nicht über variablen übergeben kann.
Kennt ihr ne andere möglichkeit dass ich irgendwie einen wert an server a übergeben damit der weiß ob die Datenbank Online oder offline ist?

(Stichwort: Wäre es ne möglichkeit beim aufrufen des scriptes auf server b (druch include von server a) eine Datei auf server b anzulegen in der entweder eine 0 oder eine 1 steht!? und diese Datei wird dann von server a ausgelesen und als wert für die Datenbank benutzt! denke in php sollte das mit sowas wie readfile möglich sein?)
 
Zuletzt bearbeitet:
Genau das gleiche dachte ich auch zuerst :D
Allerdings glaube ich nicht, dass dies funktioniert, da ich ja nicht an das zweite script Daten sende, sondern mir das zweite script daten senden soll.
Dass sieht dann etwas wie folgt aus:

server a:
include ip/script_server_b.php
wenn $online==1, "Datenbank ist online"


server b:
connect to database
if connected, $online=1, disconnect

Um das mit den Parametern im Link machen zu können, müsste ich ja das Script auf server b aufrufen und dann an das auf server a weitergeben!

Vielleicht irre ich mich auch, oder du würdest die parameter irgendwie anders benutzen als ich.
Ich kann auch gerne mal meine beiden scripte hier teilweiße reinstellen, falls es auch hilft. Es wäre halt schön um eine extra Datei herumzukommen, denn das wäre irgendwie pfusch.


edit:
so ich habe hier noch eine idee mit den parametern im link:
auf server a(Überwachungsserver):
-uebersicht.php
-webspacecheck.php

auf server b(soll überwacht werden):
-databasecheck.php

Zum aufrufen würde ich die uebersicht.php öffnen. In dieser ist per include die databasecheck.php eingefügt. In dieser databasecheck-Datei wird die webspacecheck.php mit parametern included. Somit wird die webspacecheck.php mit einem Parameter (ob Datenbank online ist) aufgerufen! --> Sie hat alle Daten um anzeigen zu können ob alles online ist.

Man müsste halt aufpassen dass die webspacecheck.php auch included wird, wenn keine connection zur datenbank in der databasecheck-Datei aufgebaut werden konnte.
Über weitere Anregungen würde ich mich sehr freuen.


ich habe mir jetzt auch nochmal fopen() angeschaut, doch leider komme ich nicht richtig mit dem befehl klar. vielleicht funktioniert das damit doch, leider versteh ichs nicht genau
 
Zuletzt bearbeitet:
Hab es mal gerade getestet, Funktioniert so wie du es haben willst:

PHP:
//servera datei
<?PHP 

$handle = fopen("www.domain.de/script.php?test=test", "r"); 

if(!$handle) {
echo 'Server ist Offline';
} else {
echo 'Server ist Online';
}

?>

//server2 Datei
<?PHP
function zurueck() {
$test = $GET['test'];
if($test =="test") {
return true;
} else {
return false;
}  
}

echo zurueck();
?>

Halt nur mit deinen Inhalten.
 
Zuletzt bearbeitet:
hm das macht ziemlich das gleiche wie mein jetziges Script.

Deine Idee ist auch super, doch ich fände es schön, wenn jetzt bei deinem Beispiel die Datei auf server a wüsste, was denn so die datei auf server b sagt.

und wenn ich das richtig sehe funktioniert das mit deinem beispiel nicht!

Hier mal mein jetziger Stand:

server a(Überwachungsserver)/webspacecheck.php:
PHP:
$webspacecheck=0;
$databasecheck=0;
$webspace_pic="offline.jpg";
$webspace_alt="Offline";
$database_pic="offline.jpg";
$database_alt="Offline";
include 'databasecheck.php';
$fp = fsockopen("localhost", 80, $errno, $errstr, 30);
if (!$fp) {
    $webspacecheck=0;
}
else {
    $webspacecheck=1;
    fclose($fp);
    }

if ($webspacecheck==1) {
$webspacestring='working';
$webspace_pic="online.jpg";
$webspace_alt="Online";
}
else {
$webspacestring='<FONT COLOR=red>NOT REACHABLE!</FONT>';
}

if ($databasecheck==1) {
$databasestring='working';
$database_pic="online.jpg";
$database_alt="Online";
}
else {
$databasestring='<FONT COLOR=red>NOT REACHABLE!</FONT>';
}
$text='<p><h3>Servermonitor</h3></p><img alt="'.$webspace_alt.'" border="0" src="'.$webspace_pic.'"> Webspace: '.$webspacestring.'<br/><img alt="'.$database_alt.'" border="0" src="'.$database_pic.'"> Database: '.$databasestring.'';
echo $text

Und auf server b (soll überwacht werden, nur der hat zugriff auf die Datenbank)/databasecheck.php:
PHP:
$databasecheck=0;

$mysqlhost='localhost'; // MySQL-Host angeben
$mysqluser='root'; // MySQL-User angeben
$mysqlpwd=''; // Passwort angeben

$connection=@mysql_connect( $mysqlhost, $mysqluser, $mysqlpwd);

if ($connection) {
$databasecheck=1;
mysql_close($connection);
}

Jetzt möchte ich eben über einen aufruf bei server a sehen, ob auf b die Datenbank und der normale Webspace erreichbar ist. Solange ich das include auf die Datei so lasse, passt alles, doch wenn das auf nen anderen server oder so verweißt, isses halt vorbei weil dann die variablen weg sind.

Könntest du vielleicht dein beispiel hier in den code einfügen, falls ich das irgendwie nicht richtig verstanden habe? Danke

Ps: Ich weiß das einiges mit Funktionen etwas einfach wäre, doch irgendwie bin ich kein Freund davon.
 
Mach es mal so:

Datei auf dem zweiten Server:

PHP:
//script.php

<?php 
function zurueck() {
$mysqlhost='localhost'; // MySQL-Host angeben 
$mysqluser='user'; // MySQL-User angeben 
$mysqlpwd='pw'; // Passwort angeben 
$connection=@mysql_connect( $mysqlhost, $mysqluser, $mysqlpwd); 
if(!$connection){
return false;
} else {
return true;
} 
mysql_close($connection);
} 
echo zurueck();
 
?>

//Wenn Datenbank erreichbar ist, wird "true" also wahr zurück geliefert
Wenn nicht wird False zurück geliefert.. auch wenn der Server komplett Offline ist.

Datenbank Online ->true
Datenbank Offline ->false
Server Offline        ->false

Dann einfach nur folgenden Code in deine vorhandene Datei einbauen:

PHP:
$einlesen = fopen("http://www.deinedomain.de/script.php", "rb"); 

if($einlesen ==true) {
echo 'Server ist Online';
} else {
echo 'Server ist Offline';
}
fclose ($einlesen);

//Du kannst auch folgendes machen um die Variable zu nutzen:

$einlesen = fopen("http://www.deinedomain.de/script.php", "rb"); 

if($einlesen ==true) {
$serverimage = '<img src="image/online.jpg" alt="Online" title="Online" \>';
} else {
$serverimage = '<img src="image/offline.jpg" alt="Offline" title="Offline" \>';
}
fclose ($einlesen);


//Du kannst dann $serverimage weiter verwenden und einfach gegen $datenbankstring tauschen!
 
Zuletzt bearbeitet: (Fehlerbehoben...)
Leider war in letzter Zeit die Zeit etwas knapp deswegen schreibe ich erst jetzt zurück.

Leider funktioniert das mit deinem Skript nicht richtig. Denn sobald er die Datei per fopen einlesen kann, sagt er mir dass der server online sei. Doch leider interessiert es ihn nen ... ob die Datenbank erreichbar ist, oder nicht...

achja: Dein erstes Skript gibt bei mir wenn die Datenbank online ist eine "1" aus, und wenn nicht, dann zeigt es einfach garnix an. Und wenn der Webspace auf dem das erste skript liegt (dass connect zur Datenbank macht) nicht erreichbar ist, läuft das zweite skript ewig, wobei das ja dann mit nem @ wahrscheinlich entfernbar ist (also der error) und dann müsste ich ja den rest machen können.

Doch dein skript zeigt eben nicht ob die DB online ist.

edit: also ich habe jetzt nochmal meine skripte bearbeitet, und vom einen überprüfen lassen, ob die datenbank online ist und dann in eine Datei entweder 0 oder 1 schreiben lassen. Doch wenn ich es vom überwachungsserver aus include(), dann funktionierts leider auch nicht weils mir sagt dass es bei includes über http keine write-befehle ausführen kann...
So langsam habe ich das gefühlt das das ganze gar nicht möglich ist.
 
Zuletzt bearbeitet:
1 = true und 0 = false

Ich weiß ja nicht was du getan hast aber bei mir Funktioniert das ganze , wenn ich zum Beispiel mein Kennwort der Datenbank absichtlich falsch schreibe liefert er false zurück und die Anzeige sagt mir sofort "Offline" bei richtigen pw liefert er logischerweise true zurück.

Wenn du es einfach haben willst, dann versuche doch über eine externe DB abfrage ob deine Datenbank Online ist oder nicht....
 
Zuletzt bearbeitet:
waren auch beide skripte auf verschiedenen servern?

Ich kann leider nicht extern auf die DB zugreifen, dann wäre es ja ein kinderspiel :lol:
 
Natürlich, auf dem gleichen würde das ja keinen sinn machen das ganze zu testen. :)

Komisch das es bei dir nicht geht.

Mal überlegen nach einer anderen lösung.

Hast du mal nach fertigen Scripten im Internet geschaut?
 
jap das habe ich gemacht.
das problem ist nur dass eigentlich alle nur überprüfen ob der server erreichbar ist.
Ich möchte aber ja auch den zustand der Datenbank wissen!

Und wenn in nem skript die datenbank dabei ist, dann musses auch aufm gleichen server sein.

Es kann natürlich sein dass bei dir die einstellungen anders sind. Wobei ich natürlich von standardeinstellungen von normalen hostern ausgehen muss, und die sind meistens ziemlich streng...
 
Nun diese Abfrage wird von jedem Server/Hoster unterstützt, wäre ja schlimm wenn nicht.
Ist ja nur ne Abfrage ob der Server erreichbar ist.

Was zeigt Server 1(mit der Datei fopen) an? bzw, was sagt dieser wenn du die Datei aufrufst?
Hast du mal die absichtlich dein PW von der Datenbank verändert, und dann nochmal geschaut?

Kann mir beim besten willen nicht vorstellen dass es nicht geht.
 
Zurück
Oben