it-swarm.com.de

Pingen einer IP-Adresse mit PHP und das Ergebnis wiederholen

Ich habe die folgende Funktion, die ich bisher nicht arbeite. Ich möchte eine IP-Adresse per Ping senden und dann bestätigen, ob die IP-Adresse aktiv ist 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 Funktion am Beispiel aufrufe:

pingAddress("127.0.0.1")

Das Echoergebnis 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: Der Code wurde dahingehend geändert, dass er die doppelten Anführungszeichen enthält, aber immer noch dieselben (falschen) Ergebnisse erzielt.

15
Bernard

HINWEIS: Die Lösung unten funktioniert nicht unter Windows. Auf Linux Exec einen Befehl "which ping" von der Konsole aus, und den Befehlspfad (des vorgeschlagenen Exec-Aufrufs) entsprechend festlegen

Ich denke, Sie möchten den Exit-Status des Befehls überprüfen, wohingegen Shell_exec Ihnen eine vollständige Ausgabe liefert (möglicherweise ist es gefährlich, die Befehlsausgabe von Befehlsversion zu Version zu ändern. Aus irgendeinem Grund). Außerdem wird Ihre Variable $ ip nicht in einfachen Anführungszeichen interpretiert. Sie müssten doppelte "" verwenden. Dies ist möglicherweise das einzige, was Sie beheben müssen, damit es funktioniert.

Aber ich denke, der folgende Code kann "tragbarer" sein. IMHO ist es tatsächlich besser, den Exit-Status zu erfassen, als zu versuchen, die Ergebniszeichenfolge zu analysieren. 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");
15
maraspin

Dies funktionierte in Wordpress auch nicht für mich. Ich habe auch -t und -n und andere Möglichkeiten ausprobiert, aber 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 .= '<div id="dialog-block-left">';
    $message .= '<div id="ip-status">The IP address, '.$ip.', is  '.$status.'</div><div style="clear:both"></div>';    
    return $message;
}
// Some IP Address
pingAddress("192.168.1.1"); 

Das funktionierte perfekt für mich, endlich ... Ich habe dies von http://www.phpscriptsdaily.com/php/php-ping/ .__ verwiesen. Hoffe, das wird helfen

Nun, ich möchte dies ändern, da es auf meinem localhost gut funktioniert, aber nicht auf meinem Liveserver. Für Live-Server habe ich eine andere Sache bekommen, die jetzt sowohl für lokal 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 dies von der Ping Site erhalten und das Ergebnis in PHP Thanks @ karim79 zurückgegeben

6

das funktioniert gut für mich ..

$Host="127.0.0.1";
$output=Shell_exec('ping -n 1 '.$Host);

echo "<pre>$output</pre>"; //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";
}
1
Arif Yaacob

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

Implementieren Sie die folgende Klasse: 

<?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";
1

Für Windows Verwenden Sie diese Klasse

$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

0
Kuldeep

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

Nach der Anfrage des OP wäre eine mögliche alternative Funktion 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;
    }
}
0
bnoeafk