La Web del Programador: Comunidad de Programadores
https://www.lawebdelprogramador.com/foros/PHP/1327270-Comprobar-estados-de-maquina-mediante-url-con-ping-en-PHP.html

Comprobar estados de maquina mediante url con ping en PHP

Comprobar estados de maquina mediante url con ping en PHP

Publicado por Javi (4 intervenciones) el 02/05/2012 13:13:25
Tengo algo parecido a esto:

$ip[0] = "www.google.es";
$ip[1] = "www.forosdelweb.com";

for ($i=0; $i<count($ip);$i++){
system("ping -n 2".$ip[$i]." | find 'TTL' /c",$result);

if ($result == 2)
{
echo $ip[$i].": OK<br>";
}
else
{
echo $ip[$i].": ERROR<br>";
}
}

Con la ejecución del comando msdos pretendo obtener el numero de lineas que contienen el texto "TTL" y por tanto el numero de pings que se han realizado correctamente. Ejecutando el comando desde consola obtengo el resultado esperado, 2.

El problema, como guardo ese dos en una variable para poder definir si el estado es OK o ERROR, en la variable result siempre me guarda 1, es decir solo me comprueba que la instrucción system se ha realizado correctamente, o eso creo...

ALGUIEN QUE PUEDA HECHARME UNA MANO XFAVOR!! gracias de antemano
Imágen de perfil de xve

Comprobar estados de maquina mediante url con ping en PHP

Publicado por xve (6935 intervenciones) el 02/05/2012 16:28:16
Hola Javi, no se sobre que sistema operativo lo estas utilizando, ya que creo que find no existe en Windows, y en linux para indicar dos pings se utiliza -c en vez de -n...
En linux, podría ser algo así:
1
$result=exec("ping -c 1 www.terra.eas > /dev/null 2>&1 || echo 'Error'")

Si ha funciona correctamente no devuelve nada, pero si ha fallado el ping devuelve Error

Espero que te sirva.... coméntanos, ok?

Comprobar estados de maquina mediante url con ping en PHP

Publicado por Javier (4 intervenciones) el 02/05/2012 17:24:35
Pues estoy trabajando en Windows. El comando FIND si existe en windows, como ya comente antes he probado la sentencia completa en la consola de msdos y funciona correctamente me devuelve el numero de pings correctos que se han obtenido, en mi caso 2.

Si ejecuto: ping -n 2".$ip[$i]." | find 'TTL' /c en msdos, me devuelve un 2.

Pero al ejecutarlo desde php no se como obtener ese 2 en una variable con la que pueda trabajar, mi problema no es el comando de msdos si no el codigo de php. He probado como haces tu cargando la funcion en una variable pero la mostrarla me sale vacia.

Al hacer

$ping = exec("ping -n 2".$ip[$i]." | find 'TTL' /c",$result)

me devuelve

$ping = nada
$result = 1 (y siempre es uno sea cual sea el resultado del ping, por lo que deduzco que lo que me esta devolviendo esque la funcion exec se ejecuto correctamente)

Lo que quiero hacer es obtener el mismo resultado que me devuelve en la consola dentro de una variable para poder determinar si la conexión esta fallando o no. Espero tu respuesta
Imágen de perfil de xve

Comprobar estados de maquina mediante url con ping en PHP

Publicado por xve (6935 intervenciones) el 02/05/2012 21:44:24
Hola Javier, he arrancado un Windows XP para visualizar lo que comentas, y realmente si existe la funcion find en msdos, aunque tal y como tu lo indicas, me da error de:
>pig -n 2 192.168.0.1 | find 'TTL'/c
FIND: Formato de parámetros incorrecto

De todos modos, en tu ejemplo, entre el numero 2 y la ip no tienes ninguna separación, y puede ser ese el problema?
que versión de Windows estas utilizando?

Comprobar estados de maquina mediante url con ping en PHP

Publicado por Javier (4 intervenciones) el 03/05/2012 08:18:43
el error de formato de parámetros creo que es debido a que falta un espacio entre 'TTL' y /c que indica que te cuente las lineas que devuelve el find. He probado a añadirle el espacio entre el numero 2 y la ip y sigue devolviendo los mismos valores. No se porque pasa, mi código lo veo lógico

Comprobar estados de maquina mediante url con ping en PHP

Publicado por Javier (4 intervenciones) el 03/05/2012 13:02:37
Ya consegui el resultado que queria:

function ping($url){
$cmd = 'tcping -n 2 '. $url .' | find "open" /c';
$output = shell_exec($cmd);
return $output;
}

$ip[0] = "www.google.es";
$ip[1] = "hp4 8243/services/Version";
$ip[2] = "hp4 8243/services/echo";
$ip[3] = "10.60.163.101 9443/services";

for ($i=0; $i<count($ip);$i++){

$result = ping($ip[$i]);

if ($result == 2)
{
echo "<br>".$ip[$i].": OK<br>";
}
else
{
echo "<br>".$ip[$i].": ERROR<br>";
}

}

Dejo el codigo por si a alguien le sirve