Monitor de Servidor en PHP
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!