Nueva pregunta

Pregunta:

Fecha: 27-03-2018 16:15:52 (En Español)

¿Cómo hacer PING desde PHP a un host remoto?[Resuelta]

Hola comunidad, por acá aportando mi granito de arena.

Hace algunos meses estaba investigando algo al respecto, encontraba información, pero no todos funcionaban, algunas funciones están obsoletas o bien, necesitaban mucha configuración por el servicio Apache o NGinx, dependiendo del servidor que utilicen; además de agregar directivas a la configuración de PHP para dar permisos o instalar uno que otro paquete, por lo que se hace mucho problema al implementarlo.

Además de PHP me gusta mucho Shell Script Bash (Linux) | Batch (Windows), por lo que me facilitó llegar a la solución. Gracias a la función exec de PHP he logrado ejecutar un comando externo del sistema operativo que es compatible con diferentes entornos, por lo que el algoritmo trabaja bien con sistemas heterogéneos.

Es una clase sencilla, llamada CheckDevice, para realizar un chequeo del dispositvo que se señalará en su implementación, donde tiene 2 métodos, el primero para obtener y comprobar el sistema operativo que se está ejecutando, en ese caso comprueba a Windows, donde utilizo caracteres ASCII para compararlos (WIN como resultado), si es así, retorno true indicando que en efecto, es Windows, sino, es Linux.
<?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;
		}
	}

El segundo método es para aplicar la función ping de forma general para ambos OS (Linux & Windows), donde a este se le pasa por parámetro la dirección IP o DNS del host a comprobar su conexión por ICMP (ping), esto es importante porque no se maneja en conexiones TCP o UDP, se mantiene en la pila de protocolos a nivel de red, por encima de IP.

Se llega a lo mismo, se comprueba el OS y con respecto a ello, se ejecuta la instrucción, la cuál es una instrucción de Shell Script Batch para Windows y Shell Script Bash para Linux. Al finalizar la ejecución de la instrucción externa, esta fue diseñada para devolver valores enteros (1 = Error, 0 = OK), donde si devuelve un datos diferente de 1, entonces es true, por lo que el host remoto ha sido encontrado.

La implementación es la siguiente, probaré con la dirección IP de la comunidad.
$ip_addr = "200.58.112.79"; #DNS: www.phpcentral.com

if ((new CheckDevice())->ping($ip_addr))
	echo "El host existe";
else 
	echo "El host no está activo";

Lo recomendable es hacer pruebas en su red local, ya que con conexiones remotas a internet, puede que respondan y luego en la siguiente actualización no lo hagan y es porque suelen tener una infraestructura de red por detrás y eso significa que pueden tener tecnología adicional como balanceadores de carga o bien, alta disponibilidad, éstos en algunos casos cambian de receptor.

Espero que el que lea esto, le sirva como a mí me ha servido mucho. Tengo otros algoritmos para realizar conexiones TCP o UDP con Sockets desde PHP puro para saber si los dispositivos están corriendo servicios o qué puertos se encuentran abiertos, para no quedarse sólo con el ping, ya que el protocolo ICMP puede estar bloqueado por algún Firewall.

¡Saludos cordiales, comunidad!
Etiquetas: Algoritmo - Aporte - ASCII - GNU Linux - Idea - Linux - PHP - PHP Avanzado - POO - Protocolos - Red - Red Remota - Shell Script - Web - Windows Votos: 3 - Respuestas: 11 - Vistas: 24 Compartir en: Google Facebook Twitter LinkedIn Link
 

Respuestas:

  • Fecha: 24-06-2019 04:55:37 Gracias   Votos: 1 - Link respuesta
     
  • Fecha: 06-07-2020 15:31:56 Muy buena tu contribución a la comunidad!

    Sirve para realizar algunas aplicaciones web, como por ejemplo para chequear algunos equipos conectados a la red LAN

    Excelente

    Espero poder encontrar mas contribuciones valiozas tuyas en la comunidad

    Saludos
      Votos: 2 - Link respuesta
     
  • Fecha: 06-07-2020 18:21:51 Por supuesto, Walter. Estaré mejorando las próximas publicaciones.

    ¡Saludos!
      Votos: 2 - Link respuesta
     
  • Fecha: 15-12-2020 12:11:08 ¡Muchas gracias! Me ayudó mucho para un pequeño proyecto persona. Pregunta, comentabas que tienes otros algoritmos para TCP o UDP, me encantaría explorar esas opciones, ¿tendrás algún tema aquí en el sitio donde los hayas compartido? ¡Muchas gracias! Abrazo   Votos: 1 - Link respuesta
     
  • Fecha: 16-04-2021 10:57:25 me sacaste de un apuro, excelente código te agradezco... tengo una duda como podría aumentar el limite de ms, tenemos unos enlaces salitrales y me los marca siempre inactivos porque el tiempo de respuesta es muy lento   Votos: 2 - Link respuesta
     
  • Fecha: 16-04-2021 14:56:28 Alejandro Sánchez, puedes incrementar el número de solicitudes con el parámetro -n

    Ejemplo:
    ping -n 5 -w 1
    
      Votos: 1 - Link respuesta
     
  • Fecha: 16-04-2021 14:58:13 Javier Olguin, un saludo.

    En este repo he implementado más cosas de redes, desde una librería de comunicación SSH, ICMP hasta software de fondo como NMAP.

    https://github.com/jersonmartinez/gnet

    Cualquier duda, me la haces saber.
      Votos: 1 - Link respuesta
     
  • Fecha: 16-04-2021 18:47:05 tienes razón con el numero de solicitudes, ahora acudo a tu conocimiento para resolver o mejorar mi idea, tengo el siguiente codigo que es para imprimir cada enlace y poner un fondo dependiendo de su status, pero siento que es algo lento porque tiene que hacer todos los ping y luego me imprime los enlaces, no logro pensar en una manera de imprimir un enlace con su ping independiente sin tener que esperar que termine toda la lista, alguna idea? Gracias de antemano

    while($row = mysqli_fetch_assoc($consultaUni)) {
    		$ip_addr = $row['puerta_enlace'];
    		//$ip_addr = '11.1.34.46';
    		if ((new CheckDevice())->ping($ip_addr)){
    			echo "<div id='".$row['ref']."' class='sitio activo'> ".$row['nom_uni'];
    			echo "<br>IP: ".$ip_addr."<br> Ref: ".$row['ref'];
    			echo "</div>";
    		}else{ 
    			echo "<div id='".$row['ref']."' class='sitio inactivo'> ".$row['nom_uni'];
    			echo "<br>IP: ".$ip_addr."<br> Status: Inactivo";
    			echo "</div>";
    		}
    	}
    
      Votos: 1 - Link respuesta
     
  • Fecha: 18-04-2021 13:27:20 Como idea, te diría que imprimas primero, sin verificar, luego, hagas solicitudes AJAX, donde verifiques el primer elemento, en la interfaz gráfica, me lo pienso que se esté el primer elemento de la lista, un efecto de "verificando..." mientras lo hace. Luego que finalice la primera solicitud, que vaya con la siguiente de la lista, hasta el final.

    He hecho algo parecido, te dejaré el segundo concreto: https://www.youtube.com/watch?v=d1Zt3-J0bpI?t=329

    GNet - Sistema Web de Gestión de Red de Dispositivos Informáticos GNU/Linux




    Espero que la idea se vaya mejorando. Saludos.
      Votos: 2 - Link respuesta
     
  • Fecha: 18-04-2021 17:34:51 sin duda alguna me diste alguna idea y si no funciona al menos el sistema que me compartes es de muy buena utilidad, tal vez termine instalándolo xD, saludos y gracias por la ayuda   Votos: 1 - Link respuesta
     
  • Fecha: 18-04-2021 21:42:35 Estupendo colega, por acá nos dejas saber las novedades, es más, si compartes el repo, podría colaborar un rato en mi tiempo libre.

    Saludos.
      Votos: 0 - Link respuesta
     
Para participar activamente de la comunidad primero debes autenticarte, ingresa al sistema.Iniciar Sesión