2011-11-06 196 views
13

Tengo la siguiente función que hasta ahora no funciona. Me gustaría hacer ping a una dirección IP y luego repetir si la IP está activa o no.Hacer ping a una dirección IP usando PHP y hacer eco del resultado

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

} 

Cuando llamo a esta función utilizando el ejemplo:

pingAddress("127.0.0.1") 

El resultado es siempre el eco 'muerto' - no importa qué.

¿Podría alguien ayudarme por favor, donde me estoy equivocando? ¿Existe algún método mejor para hacer esto con el mismo resultado?

Muchas gracias.

Actualización: Ha modificado el código para incluir las comillas dobles pero sigue obteniendo los mismos resultados (incorrectos).

+2

Es necesario utilizar comillas dobles para su llamada a '' shell_exec' lo contrario $ ip' no serán reemplazados. – Clive

+0

Hola, Clive, gracias. He usado comillas dobles ahora pero sigo obteniendo los mismos resultados. – Bernard

Respuesta

15

NOTA: La siguiente solución no funciona en Windows. En Linux ejecutivo a "que ping" comando desde la consola, y establecer la ruta de comandos (de la llamada exec sugerido) de acuerdo con

Creo que desea comprobar el estado de salida del comando, mientras que shell_exec le da salida completa (podría ser peligroso debe ordenar el cambio de salida de la versión de comando a la versión. Por alguna razón). Además, su variable $ ip no se interpreta dentro de comillas simples. Tendría que usar los dobles "". Eso podría ser lo único que necesita corregir para que funcione.

Pero creo que el siguiente código puede ser más "portátil". En mi humilde opinión, de hecho, es mejor capturar el estado de salida, en lugar de tratar de analizar la cadena de resultados. En mi humilde opinión, también es mejor especificar la ruta completa al comando de 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, he intentado usar esta función arriba exactamente, pero esto dirá que incluso 999.999.999.999 está vivo cuando lo intento, ¿podría haber algo más? ¿Podría sugerir algún consejo para la resolución de problemas? – Bernard

+4

** 1) ** 'ping', como la mayoría de las utilidades de línea de comandos de UNIX, devuelve 0 en éxito, no 1. ** 2) ** El OP usa Windows, por lo que'/bin/ping' no funcionará . – duskwuff

+1

eliminando/bin/y cambiando 0 a 1 parece haber funcionado - gracias a todos. – Bernard

5

Esto tampoco funcionó para mí en Wordpress. También probé -t y -n y otras formas, pero no funcionó. Usé,

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

Esto funcionó perfectamente para mí, finalmente. que se refiere esto desde http://www.phpscriptsdaily.com/php/php-ping/ la esperanza que esto ayudará

Bueno, yo quiero modificar esto, ya que está funcionando muy bien en mi localhost, pero no en mi servidor vivo Para el servidor en vivo, tengo otra cosa que ahora funciona tanto para locales así como en vivo.

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

continuación muestro el servidor está activo durante 0 y hacia abajo para

1.

Esto funciona perfectamente para mí. Obtuve esto desde Ping site and return result in PHP Gracias @ karim79

0

Esto funciona bien con nombre de host, IP inversa (para redes internas) 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

Nunca use la entrada del usuario directamente en 'exec'. Consulte [esta pregunta] (http://stackoverflow.com/q/982904/2008285) para conocer una forma correcta de desinfectar los datos de entrada del usuario. – Linek

+0

Yhe, cierto. En mi código tengo una función de desinfección alrededor de $ _get, pero un poco no relevante para esta pregunta, así que lo eliminé. Editado: Se eliminó el parámetro $ _get para que quede claro. – ChristianG

0

esto funciona bien para mí ..

$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

Para Windows Utilice esta clase

$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

utilizo esta función:

<?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

hacer Compruebe las páginas del manual de su comando ping antes de probar algunos de estos ejemplos (siempre buenas prácticas de todos modos). Para Ubuntu 16 (por ejemplo) la respuesta aceptada no funciona ya que el -n 3 falla (este no es el conteo de paquetes más, -n indica que no se convierte la dirección IP a un nombre de host).

Tras la petición de la OP, una función potencial alternativa sería la siguiente:

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