2011-01-13 9 views
1

Ich versuche, dies in PHP zu tun. Ich muß überprüfen, ob ein bestimmtes Host „up“Gibt es eine Möglichkeit zu überprüfen, ob ein Host aktiv ist?

ist ich dachte, die angegebene Host Pingen (obwohl ich nicht sicher bin, wie ich würde, denn das würde root erforderlich. --help hier?)

Ich benutze auch fsockopen(), um zu versuchen, an einem bestimmten Port zu verbinden, aber das würde auch fehlschlagen, wenn der Host nicht auf Verbindungen auf diesem Port lauschte.

Darüber hinaus blockieren einige Hosts Ping-Anfragen, also wie kann ich das umgehen? Dieser Teil ist jedoch keine Notwendigkeit, also mach dir deswegen nicht zu viele Sorgen. Mir ist klar, dass es schwierig werden könnte.

+3

Welche Service möchten Sie up-ness überprüfen? –

+0

Der Gastgeber im Allgemeinen. Kein spezifischer Service. Grundsätzlich wenn der Host online ist. Einige der Hosts haben keinen Webserver oder so, das wird schwierig. – Rob

Antwort

3

Die kurze Antwort ist, dass es keine gute, universelle Möglichkeit gibt, dies zu tun. Ping ist ungefähr so ​​nah wie möglich (fast alle Hosts werden darauf reagieren), aber wie Sie gesehen haben, benötigt PHP in der Regel Root-Zugriff, um den Low-Port zu verwenden.

Kann Ihr Host Systemaufrufe ausführen, so dass Sie den Ping-Befehl auf Betriebssystemebene ausführen und dann die Ergebnisse analysieren können? Dies ist wahrscheinlich die beste Wahl.

$result = exec("ping -c 2 google.com"); 

Wenn ein Host eine Ping-Anforderung blockiert, könnten Sie eine allgemeinere Portscan- tun für andere offene Ports zu sehen (aber das ist ziemlich unhöflich, tun es nicht an Hosts, die nicht gegeben haben Sie bestimmen Genehmigung). Nmap ist ein gutes Werkzeug dafür. Es verwendet einige Tricks, um herauszufinden, ob ein Host aktiv ist und welche Dienste ausgeführt werden können oder nicht. Seien Sie jedoch vorsichtig, da einige Shared-Hosting-Anbieter Ihr Konto wegen "Hacking-Aktivitäten" beenden, wenn Sie Nmap installieren und verwenden, insbesondere gegen Hosts, die Sie nicht kontrollieren oder deren Berechtigung Sie testen können.

Darüber hinaus, wenn Sie auf der gleichen nicht geschalteten Ethernet-Schicht wie ein anderer Host sind (wenn Sie zum Beispiel im selben offenen WiFi-Netzwerk sind), kann ein Ethernet-Adapter im Promiscuous-Modus Verkehr zu und von einem Host schnüffeln auch wenn es nicht direkt auf dich reagiert.

+0

Würde das exec() nicht root erfordern? – Rob

+0

Diese exec würde normalerweise root nicht benötigen. Ping ist normalerweise für normale Benutzer erlaubt, und 'exec' hat in PHP niemals root benötigt. Der 'exec' wird mit den gleichen Berechtigungen ausgeführt wie der Benutzer, unter dem PHP läuft. –

+0

hat mich nicht gelassen. 'ping: icmp open socket: Betrieb nicht erlaubt' – Rob

4

Normalerweise mache ich eine einfache CURL für eine öffentliche Seite und sehen, ob es eine 200 zurückgibt. Wenn Sie eine 500, 404 oder irgendetwas neben einer 200 Antwort erhalten, wissen Sie etwas fischig ist.

+2

das ist mein Weg, zusätzlich ist es nützlich, nur eine HEAD Anfrage zu verwenden. Viel schneller und genug Informationen enthalten. –

+0

Wen diese Antwort beantwortet hat, sollte erklärt haben, warum sie falsch oder nicht vorhanden ist. – buley

0

Damit der Host überhaupt überwacht werden kann, muss mindestens ein Port offen sein. Ist der Host ein Webserver? Wenn dies der Fall ist, können Sie einfach eine Verbindung zu Port 80 öffnen, solange sie erfolgreich geöffnet ist, funktioniert zumindest ein Teil des Hosts.

Eine bessere Lösung wäre, ein Skript zu haben, das nur für Ihren Monitor zugänglich ist, und dann könnten Sie eine Verbindung dazu herstellen, und dieses Skript würde verschiedene Teile von Systeminformationen zurückgeben.

EDIT--

Wie gründlich Sie diesen Test zu sein? [Server auf] -> [Apache läuft] -> [Web-Anwendung funktioniert] Sind alle verschiedenen Ebenen der Arbeit. Wenn Sie nur zeigen, dass Apache etwas zurückgibt, wird zumindest angezeigt, dass der Server eingeschaltet ist, aber nicht, dass Ihre Webanwendung ausgeführt wird. (Ich weiß, dass Sie nicht so etwas laufen kann, aber ich hoffe, es ist ein gutes Beispiel ist)

EDIT--

Würde es sich lohnen, einen leichten http-Server installieren (ich meine sehr geringes Gewicht) nur für Überwachung?

Könnte das nicht passieren, dass Sie etwas auf den Hosts installieren könnten, die immer wieder nach Hause telefonierten, um zu zeigen, dass sie aufgebraucht sind?

1

könnten Sie cURL verwenden

$url = 'yoururl'; 
$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_NOBODY, true); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_exec($ch); 
$retcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
curl_close($ch); 
if (200==$retcode) { 
    // All's well 
} else { 
    // not so much 
} 
+1

Und wenn dieser Host keinen Webserver ausführt? Oder es ist nicht auf Port 80? –

+0

Wenn es nicht ausgeführt wird, die Domäne nicht existiert, oder nicht auf Port 80, gibt der $ retcode int (0) zurück. Wenn Sie andere Ports überprüfen müssen, fügen Sie eine Portnummer hinzu. Wir verwenden diese Lösung lange Zeit ohne Probleme in einer Produktionsumgebung. –

Verwandte Themen