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.
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 Crashell.
$ip_addr = "3.23.158.127"; #DNS: www.crashell.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.
With supporting text below as a natural lead-in to additional content.
Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled.