2011-11-06 13 views
13

Ho la seguente funzione che non funziona fino ad ora. Vorrei eseguire il ping di un indirizzo IP e quindi fare eco se l'IP è vivo o no.Pingare un indirizzo IP usando PHP e riecheggiando il risultato

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"; 
    } 

} 

Quando chiamo questa funzione utilizzando l'esempio:

pingAddress("127.0.0.1") 

Il risultato eco è sempre 'morto' - non importa quale.

Qualcuno potrebbe aiutarmi dove sto andando male? E/O c'è un metodo migliore per farlo con lo stesso risultato?

Molte grazie.

Aggiornamento: è stato modificato il codice per includere le virgolette doppie ma ottenendo sempre gli stessi risultati (errati).

+2

È necessario usare le virgolette per la vostra chiamata a '' altrimenti shell_exec' $ ip' non saranno sostituiti. – Clive

+0

Ciao Clive, grazie - ho usato le doppie virgolette ora ma ottenendo sempre gli stessi risultati. – Bernard

risposta

15

NOTA: la soluzione seguente non funziona su Windows. Su linux eseguire un comando "which ping" dalla console e impostare il percorso del comando (della chiamata exec suggerita) di conseguenza

Penso che si voglia controllare lo stato di uscita del comando, mentre shell_exec fornisce output completo (potrebbe essere pericoloso deve comandare la modifica dell'uscita dalla versione del comando alla versione per qualche motivo). Inoltre la variabile $ ip non viene interpretata tra virgolette singole. Dovresti usare il doppio "". Potrebbe essere l'unica cosa che devi aggiustare per farlo funzionare.

Ma penso che il seguente codice possa essere più "portatile". IMHO è infatti meglio prendere lo stato di uscita, piuttosto che cercare di analizzare la stringa dei risultati. IMHO è anche meglio specificare il percorso completo per il comando ping.

<?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"); 
+0

HI maraspin, ho provato ad usare questa funzione sopra esattamente, ma questo dirà che anche 999.999.999.999 è vivo quando lo provo - potrebbe esserci qualcos'altro di sbagliato? Potresti suggerire suggerimenti per la risoluzione dei problemi? – Bernard

+4

** 1) ** 'ping', come la maggior parte delle utilità della riga di comando UNIX, restituisce 0 in caso di successo, non 1. ** 2) ** L'OP utilizza Windows, quindi'/bin/ping' non funzionerà . – duskwuff

+1

rimozione/bin/e il cambio da 0 a 1 sembra aver funzionato - grazie a tutti. – Bernard

5

Anche questo non ha funzionato per me in Wordpress. Ho anche provato -t e -n e in altri modi, ma non ha funzionato. Ho usato,

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"); 

Questo ha funzionato perfettamente per me, finalmente. ho deferito tale da http://www.phpscriptsdaily.com/php/php-ping/ Spero che questo vi aiuterà

Beh, io voglio modificare questo come si sta lavorando bene sul mio localhost, ma non sul mio server di vivere Per server di vivere, ho ottenuto un'altra cosa, che ora lavora per sia locali così come vivere.

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

Poi mi mostrano il server è attivo per 0 e giù per il 1.

Questo funziona perfettamente per me. Ho ottenuto questo da Ping site and return result in PHP Grazie @ karim79

0

Questo funziona bene con hostname, IP inverso (per reti interne) e IP.

function pingAddress($ip) { 
    $ping = exec("ping -n 2 $ip", $output, $status); 
    if (strpos($output[2], 'unreachable') !== FALSE) { 
     return '<span style="color:#f00;">OFFLINE</span>'; 
    } else { 
     return '<span style="color:green;">ONLINE</span>'; 
    } 
} 

echo pingAddress($ip); 
+0

Non utilizzare mai l'input dell'utente direttamente in 'exec'. Vedere [questa domanda] (http://stackoverflow.com/q/982904/2008285) per un modo corretto di disinfettare i dati di input dell'utente. – Linek

+0

Sì, vero. Nel mio codice ho una funzione di pulizia attorno a $ _get, ma non pertinente per questa domanda, quindi l'ho rimosso. Modifica: rimosso il parametro $ _get per essere chiaro. – ChristianG

0

questo funziona bene per me ..

$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

Per Windows Utilizzare questa classe

$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

Io uso questa funzione:

<?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; 
} 
0

eseguire controllo le pagine man del comando ping prima di provare alcuni di questi esempi (sempre buona pratica comunque). Per Ubuntu 16 (per esempio) la risposta accettata non funziona come il -n 3 fallisce (questo non è il conteggio dei pacchetti più, -n non denota convertire l'indirizzo IP a un nome host).

In seguito alla richiesta del PO, un potenziale funzione alternativa potrebbe essere il seguente:

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; 
    } 
}