2012-12-13 2 views
5

Ich möchte überprüfen, ob ein anderer Rechner generell mit PHP antwortet.Kann PHP ein Remote-System ohne ICMP und ohne externe Programme pingen?

Die meisten Ansätze bestehen darin, einen auf dem Zielcomputer ausgeführten Dienst zu pingen, aber ich möchte überprüfen, ob der Computer im Allgemeinen online ist.

Ich habe http://birk-jensen.dk/2010/09/php-ping/ gefunden, die angeblich ein ICMP Ping-Paket sendet. Das Problem ist, irgendwie muss man root sein, um eine socket_create(AF_INET, SOCK_RAW, 1) durchzuführen. Die Problemumgehung über posix_seteuid(0) funktioniert auch nicht, da auch dafür erhöhte Berechtigungen erforderlich sind.

Alle Funktionen, die das Programm ping ausführen könnten, sind in meinem Szenario auch nicht verfügbar.

Also, wie überprüfe ich, ob ein Server online mit PHP ist?

+1

'System (" Ping ist yahoo.com ') '?? –

+0

Haben Sie Zugriff auf den Remote-Server (z. B. ssh)? –

+2

Wenn Sie keine Berechtigungen haben, erstellen Sie einen ICMP-Socket und Sie sind nicht berechtigt, ein externes Programm zum Ausführen von ICMP-Echo auszuführen, dann können Sie kein ICMP-Echo ausführen. Wenn Sie Ihre Prüfung nicht auf einem Dienst oder einem anderen Dienst basieren möchten, zu dem Sie eine Berechtigung haben, eine Verbindung herzustellen, sind Sie irgendwie blockiert. Es ist unwahrscheinlich, dass Sie dafür spezifisch "root" sein müssten, Ihr Benutzerkonto müsste einfach diese Erlaubnis erhalten. Wenden Sie sich an den Serveradministrator, und prüfen Sie, ob dies für Sie möglich ist. – DaveRandom

Antwort

1

hierfür ping Sie, ist dies höchst unwahrscheinlich macht aussagekräftige Daten versuchen möchten, aber es ist etwas über grok.

Wenn Sie einen tcp-Socket zu einem zufälligen Port öffnen und statt Zeitlimit sofort schließt. dann ist die Maschine "hoch", aber das bedeutet nicht viel mehr als das. Es könnte in einer Kernel-Panik sein.

und ein Timeout bedeutet nicht, dass die Maschine heruntergefahren ist. Anstatt den tcp-Handschlag abzuweisen, ließ er es fallen.

Sie werden nicht in der Lage sein, irgendeine Art von sinnvollen Timing-Daten mit diesem zu erhalten, aber geben Sie mehr eine begründete Vermutung, wenn die betreffende Maschine an oder aus ist.

<?php 
$sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP); 
socket_connect ($sock , string $address,22) === true) { 
switch(socket_last_error($sock)) { 
    case 110: 
    case 112: 
    case 113: 
     echo 'Machine may be down'; 
     break; 
    case 111: 
     echo 'Machine may be up'; 
     break; 
    case 115: 
     echo 'Machine is up'; 
     break; 
    default: 
     echo 'Machine in unknown state.'; 
     break; 
} 

Sie bereits erklärt, dass Sie nicht den Ping-Befehl verwenden können, so Net_Ping wird nicht funktionieren, da es nur eine andere Schnittstelle zum Ping-Befehl im Betriebssystem