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!
Diciembre 2nd, 2009 at 10:48
[...] ¡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. [...]
Enero 21st, 2010 at 14:39
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?
Enero 21st, 2010 at 22:50
es raro Martin, a mi siempre me funcionó bien… es más, hasta recibo las notificaciones como corresponde…
Mayo 4th, 2010 at 11:48
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
Mayo 4th, 2010 at 11:55
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.
Mayo 4th, 2010 at 14:11
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..
Mayo 4th, 2010 at 14:16
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');Mayo 4th, 2010 at 14:19
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.
Mayo 4th, 2010 at 16:07
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…