Nov 20

Hace unos días me surgió la necesidad de monitorear el estado de un servidor (si esta UP o DOWN) y recibir notificaciones via e-mail cuando se cayera. Probe un par de servicios gratuitos, pero sólo realizaban comprobaciones cada 30 minutos, por ejemplo.

Entonces se me ocurrió hacerlo por mí mismo, y conseguí realizarlo utilizando un servidor de hosting gratuito como 00webhost realizando comprobaciones cada 5 minutos y notificando las caídas via e-mail al instante.

Acá les muestro cómo hacerlo:

1. Debemos crear una cuenta de usuario gratuita en 00webhost.com. No es necesario que registremos un dominio .com personalizado, simplemente utilizamos un subdominio de los que nos proveen.

2. Una vez creada la cuenta, vamos a generar un archivo PHP llamado monitor.php con el siguiente contenido:

Archivo: monitor.php

<?php
 
	require_once ('Libmail.class.php');
 
	// Function to check response time
	function pingDomain($domain){
		$starttime = microtime(true);
		$file      = fsockopen ($domain, 80, $errno, $errstr, 10);
		$stoptime  = microtime(true);
		$status    = 0;
 
		if (!$file) $status = -1;  // Site is down
		else {
			fclose($file);
			$status = ($stoptime - $starttime) * 1000;
			$status = floor($status);
		}
		return $status;
	}
 
	// notificamos via email
	if (pingDomain('www.cordobalquila.com.ar') < 0) {
		$m= new Mail;
		$m->From("mailDesde@mail.com.ar");
		$m->To("mailPara@mail.com");
		$m->Subject("El sitio www.cordobalquila.com.ar esta caido");
 
		$message= "El sitio esta caido";
		$m->Body($message);
		$m->Send();
	}
?>

Ahora vamos a explicar un poco el código anterior:

require_once ('Libmail.class.php');

Esta es una clase de PHP de distribución gratuita disponible en PHPClasses para modelar el envío de e-mails con PHP, pueden descargarla desde acá.

// Function to check response time
	function pingDomain($domain){
		$starttime = microtime(true);
		$file      = fsockopen ($domain, 80, $errno, $errstr, 10);
		$stoptime  = microtime(true);
		$status    = 0;
 
		if (!$file) $status = -1;  // Site is down
		else {
			fclose($file);
			$status = ($stoptime - $starttime) * 1000;
			$status = floor($status);
		}
		return $status;
	}

Esta funcion devuelve el tiempo de acceso a la URL pasada por parametro (en milisegundos), devolviendo -1 si el sitio está caído (esto nos permitirá comprobar luego el estado).

Y por último:

// notificamos via email
	if (pingDomain('www.cordobalquila.com.ar') < 0) {
		$m= new Mail;
		$m->From("contacto@cordobalquila.com.ar");
		$m->To("joarobles89@gmail.com");
		$m->Subject("El sitio www.cordobalquila.com.ar esta caido");
 
		$message= "El sitio esta caido";
		$m->Body($message);
		$m->Send();
	}

Realizamos una comprobacion si el sitio está caído, en caso positivo notificamos via e-mail a la direccion que corresponda.

Ahora bien, la parte mas importante, planificar la tarea para que el servidor realice esta comprobacion cada cierto período de tiempo. Lo positivo es que 00webhost nos permite planificar tareas hasta en intervalos de 5 minutos, que es lo que considero bastante apropiado.

Desde nuestro panel de administración de la cuenta, vamos a la opción Cron Jobs y asignamos intervalos de 5 minutos a la ejecucion del comando php -f RUTA_DEL_ARCHIVO/monitor.php.

Listo, eso es todo! Ahora bien, podemos jugar un poco con este modelo para comprobar el estado de múltiples sitio, guardar Stats en una base de datos, etc, etc, etc…
Suerte, y hasta la próxima!

9 Responses to “Monitor de Servidor en PHP”

  1. Monitor de servidor en PHP | Alojate.com Tu Proveedor de Web Hosting, Dominios, VPS, Servidores Dedicados, Factura Electrónica y Marketing para Buscadores en México Says:

    [...] ¡Listo, eso es todo! Ahora bien, podemos jugar un poco con este modelo para comprobar el estado de múltiples sitio, guardar stats en una base de datos, etc, etc, etc. Código fuente completo y listo con instrucciones detalladas en mi blog. [...]

  2. Martin Says:

    Buenas,

    Sabes que el código no da error pero la función pingDomain devuelve siempre números positivos, a pesar de que le pongo la dirección de algún sitio no valido.

    Probaron eso?

  3. Joaquin L. Robles Says:

    es raro Martin, a mi siempre me funcionó bien… es más, hasta recibo las notificaciones como corresponde…

  4. Rodrigoreyes Says:

    Hola
    tengo una pregunta se que muy basica pero hasta ahora entro al mundo php, debo incluir la libreria que indicas ‘Libmail.class.php’ en la misma ubicacion que coloque mi archivo serv php
    lo he puesto en

    php -f /www/serv.php

    Gracias

  5. joarobles Says:

    Rodrigo, puedes colocar la libreria en cualquier directorio, es recomendable hacerlo en otro separado del contenido para mayor organización, ejemplo en una carpeta llamada “lib”. Luego deberás modificar tu directiva require o include para apuntar a este archivo, ya sea de forma relativa o absoluta proporcionando el PATH que corresponda. Recuerda que también puedes definir un “include path” para PHP, en donde podrás colocar tus librerias para luego requerirlas proporcionando una ruta relativa a este directorio.

  6. Rodrigoreyes Says:

    hola
    joarobles

    muchas gracias por tu ayuda, he declarado la libreria asi

    <?php

    require_once ('/home/demo/public_html/lib/Libmail.class.php');

    asi esta bien hecho..

  7. joarobles Says:

    de nada, si tu archivo en el que llamas a la libreria se encuentra tmb en public_html puedes realizar la llamada require con el argumento relativo, de la forma:

    require_once ('lib/Libmail.class.php');

  8. Rodrigoreyes Says:

    hola joarobles

    perdon por preguntar tanto estoy hasta ahora comensando en este mundo de php tan grande, mira el error que me envia el cron del server

    —————————————————————————-

    Warning: require_once(/home/demo/public_html/lib/Libmail.class.php) [function.require-once]: failed to open stream: No such file or directory in /home/demo/public_html/serv.php on line 3

    Fatal error: require_once() [function.require]: Failed opening required ‘/home/demo/public_html/lib/Libmail.class.php’ (include_path=’.:/usr/lib/php:/usr/local/lib/php’) in /home/demo/public_html/serv.php on line 3

    encontre este servidor que
    Warning: require_once(/home/demo/public_html/lib/Libmail.class.php) [function.require-once]: failed to open stream: No such file or directory in /home/demo/public_html/serv.php on line 3

    Fatal error: require_once() [function.require]: Failed opening required ‘/home/demo/public_html/lib/Libmail.class.php’ (include_path=’.:/usr/lib/php:/usr/local/lib/php’) in /home/demo/public_html/serv.php on line 3

    —————————————————————————-

    de hecho estoy probando el cron en un server de pruebas que encontre que me parece muy bueno. mira esta pagina http://www.hostingwebla.com y a mano derecho sale prueba nuestro cpanel hay estoy haciendo los test del cron para despues montarlo en mi servidor.

    Gracias.

  9. joarobles Says:

    Ese error viene porque, como dice lu información, el archivo no existe en el directorio especificado. Proba con utilizar una ruta relativa, coloca la libreria en la misma carpeta que el archivo PHP que hace el control del servidor y dale:
    require_once (‘Libmail.class.php’);

    no deberías tener problemas de esta forma, te recomiendo googlear sobre rutas de archivos en sistemas linux…

Leave a Reply

Powered By Wordpress - Theme Provided By Wordpress Theme - No Credit Auto Loan