Ping eine IP-Adresse mit PHP und echo das Ergebnis

Ich habe folgende function, die ich bisher nicht bearbeitet habe. Ich möchte eine IP-Adresse pingen und dann Echo, ob die IP lebt oder nicht.

function pingAddress($ip){ $pingresult = shell_exec("start /b ping $ip -n 1"); $dead = "Request timed out."; $deadoralive = strpos($dead, $pingresult); if ($deadoralive == false){ echo "The IP address, $ip, is dead"; } else { echo "The IP address, $ip, is alive"; } } 

Wenn ich diese function am Beispiel anrufe:

 pingAddress("127.0.0.1") 

Das Echo-Ergebnis ist immer “tot” – egal was passiert.

Könnte mir bitte jemand helfen, wo ich falsch liege? Und / ODER gibt es eine bessere Methode, dies mit dem gleichen Ergebnis zu tun?

Danke vielmals.

Update: Haben Code geändert, um die Anführungszeichen einzuschließen, aber immer noch die gleichen (falschen) Ergebnisse zu erhalten.

HINWEIS: Die folgende Lösung funktioniert nicht unter Windows. Unter linux führe einen Befehl “which ping” von der Konsole aus und setze den Befehlspfad (des vorgeschlagenen exec-Aufrufs) entsprechend

Ich denke, dass Sie den Exit-Status des Befehls überprüfen möchten, während shell_exec Ihnen die volle Ausgabe gibt (möglicherweise gefährlich, sollte die Befehlsausgabe von der Befehlsversion in die Version geändert werden. Aus irgendeinem Grund). Außerdem wird Ihre Variable $ ip nicht in einfachen Anführungszeichen interpretiert. Sie müssten doppelte “” verwenden. Das ist möglicherweise das einzige, was Sie reparieren müssen, damit es funktioniert.

Aber ich denke, folgender Code kann “tragbarer” sein. IMHO ist es in der Tat besser, den Exit-Status abzufangen, als zu versuchen, den Ergebnis-String zu parsen. IMHO ist es auch besser, den vollständigen Pfad zum Ping-Befehl anzugeben.

 < ?php function pingAddress($ip) { $pingresult = exec("/bin/ping -n 3 $ip", $outcome, $status); if (0 == $status) { $status = "alive"; } else { $status = "dead"; } echo "The IP address, $ip, is ".$status; } pingAddress("127.0.0.1"); 

Das hat in WordPress auch nicht funktioniert. Ich habe auch versucht -t und -n und andere Wege, aber hat nicht funktioniert. Ich benutzte,

 function pingAddress($ip) { $pingresult = exec("/bin/ping -c2 -w2 $ip", $outcome, $status); if ($status==0) { $status = "alive"; } else { $status = "dead"; } $message .= '
'; $message .= '
The IP address, '.$ip.', is '.$status.'
'; return $message; } // Some IP Address pingAddress("192.168.1.1");

Das hat schließlich perfekt für mich funktioniert. Ich habe das von http://www.phpscriptsdaily.com/php/php-ping/ bezogen. Hoffe, das wird helfen

Nun, ich möchte dies ändern, da es auf meinem localhost funktioniert, aber nicht auf meinem Live-Server. Für den Live-Server habe ich eine andere Sache, die jetzt sowohl für lokale als auch für Live funktioniert.

 $fp = fSockOpen($ip,80,$errno,$errstr,1); if($fp) { $status=0; fclose($fp); } else { $status=1; } 

Dann zeige ich, dass der Server für 0 und für 1 heruntergefahren ist.

Das funktioniert perfekt für mich. Ich habe das von der Ping-Seite und gebe das Ergebnis in PHP Thanks @ karim79 zurück

das funktioniert gut für mich ..

 $host="127.0.0.1"; $output=shell_exec('ping -n 1 '.$host); echo "
$output

"; //for viewing the ping result, if not need it just remove it if (strpos($output, 'out') !== false) { echo "Dead"; } elseif(strpos($output, 'expired') !== false) { echo "Network Error"; } elseif(strpos($output, 'data') !== false) { echo "Alive"; } else { echo "Unknown Error"; }

Für Windows Verwenden Sie diese class

 $host = 'www.example.com'; $ping = new Ping($host); $latency = $ping->ping(); if ($latency !== false) { print 'Latency is ' . $latency . ' ms'; } else { print 'Host could not be reached.'; } 

https://github.com/geerlingguy/Ping

Dies funktioniert gut mit Hostname, Reverse IP (für interne Netzwerke) und IP.

 function pingAddress($ip) { $ping = exec("ping -n 2 $ip", $output, $status); if (strpos($output[2], 'unreachable') !== FALSE) { return 'OFFLINE'; } else { return 'ONLINE'; } } echo pingAddress($ip); 

Ich benutze diese function:

 < ?php function is_ping_address($ip) { exec('ping -c1 -w1 '.$ip, $outcome, $status); preg_match('/([0-9]+)% packet loss/', $outcome[3], $arr); return ( $arr[1] == 100 ) ? false : true; } 

Überprüfen Sie die man-Seiten Ihres Ping-Befehls, bevor Sie einige dieser Beispiele ausprobieren (immer gute Praxis). Für Ubuntu 16 (zum Beispiel) funktioniert die angenommene Antwort nicht, da das -n 3 fehlschlägt (dies ist nicht die Anzahl von Paketen mehr, -n bedeutet, dass die IP-Adresse nicht in einen Hostnamen umgewandelt wird).

Auf Antrag des OP wäre eine mögliche alternative function wie folgt:

 function checkPing($ip){ $ping = trim(`which ping`); $ll = exec($ping . '-n -c2 ' . $ip, $output, $retVar); if($retVar == 0){ echo "The IP address, $ip, is alive"; return true; } else { echo "The IP address, $ip, is dead"; return false; } } 

Ich habe den Algorithmus entwickelt, um mit einem heterogenen Betriebssystem, sowohl Windows als auch Linux, zu arbeiten.

Implementieren Sie die folgende class:

 < ?php class CheckDevice { public function myOS(){ if (strtoupper(substr(PHP_OS, 0, 3)) === (chr(87).chr(73).chr(78))) return true; return false; } public function ping($ip_addr){ if ($this->myOS()){ if (!exec("ping -n 1 -w 1 ".$ip_addr." 2>NUL > NUL && (echo 0) || (echo 1)")) return true; } else { if (!exec("ping -q -c1 ".$ip_addr." >/dev/null 2>&1 ; echo $?")) return true; } return false; } } $ip_addr = "151.101.193.69"; #DNS: www.stackoverflow.com if ((new CheckDevice())->ping($ip_addr)) echo "The device exists"; else echo "The device is not connected";