New question

Question:

Date: 27-03-2018 16:15:52 (In Spanish)

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

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!
Tags: Algorithm - ASCII - GNU Linux - Input - Linux - Manuals - Network - OOP - PHP - PHP Advanced - Protocols - Remote Network - Shell Script - Web - Windows Votes: 1 - Answers: 1 - Views: 21 Share on: Google Facebook Twitter LinkedIn Link
 

Answers:

To actively participate in the community first must authenticate, enter the system.Sign In