My kemenworld…

To mock or not to mock…

Escribiendo daemons en PHP (Parte I)

Posted by kementeus en diciembre 24, 2006

Algunos de ustedes tal vez no los conocían, de hecho quizás aunque los usan a diario en sus computadores y servidores no sabían de su existencia, y otros que ya los conocían quizás pensaban que era de alguna manera macabra que se creaban, bueno, he aquí mi granito de arena no solo para esclarecer la existencia de los daemons usando uno de los lenguajes que creo nadie usaría para hacerlo, unix daemons en PHP😀

Qué es un daemon?

Un daemon es un proceso que corre en segundo plano sin ayuda ni intervención de un usuario, reciben este extraño nombre debido a que corren “debajo de la tierra” o mejor dicho sin que ningún usuario se percate de la existencia de un daemon. De hecho aunque este comportamiento nos parezca extraño es normal para los procesos o tareas que ellos efectúan, Wikipedia tiene un grandioso artículo sobre daemons y el origen del nombre en este link.

Para qué nos puede servir un daemon? Imagínense el caso de una aplicación que suele dejar datos temporales en tuplas de una tabla en la base de datos. Podría ser datos de una sesión de un usuario o de links de downloads que ya han caducado, la forma “normal” en que he visto que se hacen este tipo de procesos es dejar corriendo un script de cron que luego a su vez ejecuta algún script de PHP que borra las tuplas en cuestión en la base de datos. Este ha sido el “approach” tradicional y que he visto en la mayoría (sino que casi en la totalidad) de aplicaciones hechas en PHP, no discutiré en este post las ventajas o desventajas de esta solución pero para efectos didácticos usaremos el ejemplo para rehacerlo en forma de un daemon en PHP. Dejo de ejercicio mental al lector otras aplicaciones o alcances de un daemon en una aplicación web.

Como funciona un daemon?

Los pasos primordiales que debe realizar un daemon son sencillos (simplificando el contenido de Wikipedia):

  • Crear un proceso hijo (pcntl_fork())
  • Irnos al directorio raíz (chdir(“/”)) y colocar nuestra umask a 0 (umask(0))
  • Soltar el proceso hijo de una terminal (posix_setsid())
  • Eliminar o matar el proceso padre (exit())
  • Seguir corriendo hasta que se decida que es hora de morir

Creo que no está de más pero para nuestro daemon necesitan tener instalado el PHP-CLI y las extensiones PCNTL (Process Control), aclaro nuevamente que esta extensión no existe en Windows (luego tocaremos que hacemos en caso de nuestra aplicación Windows).

El daemon en PHP

Comenzaremos con un daemon “rústico” que simplemente nos imprima la hora del mensaje en la consola activa actual:

 

 1 <?php 
 2 // Simple demonio escrito en PHP 
 3  
 4 // Primero creamos un proceso hijo 
 5 $pid = pcntl_fork(); 
 6 if($pid == -1){ 
 7     die("Algo pasó con el forking del proceso!"); 
 8 } 
 9  
10 // Preguntamos si somos el proceso padre o el hijo recien construido 
11 if($pid) { 
12     // Soy el padre por lo tanto necesito morir 
13     exit("Proceso padre terminado...n"); 
14 } 
15  
16 // De aqui en adelante solo se ejecuta si soy el hijo y futuro daemon 
17  
18 // Lo siguiente que hacemos es soltarnos de la terminal de control 
19 if (!posix_setsid()) { 
20     die ("No pude soltarme de la terminal"); 
21 } 
22  
23 // De este punto en adelante debemos cambiarnos de directorio y 
24 // hacemos las recomendaciones de Wikipedia para un daemon 
25 chdir("/"); 
26 umask(0); 
27  
28 // Si estamos aqui oficialmente somos un daemon 
29 for($i = 1; $i < 10;$i++) { 
30     $date = date("h:i:s"); 
31     echo "$date hola amigo, te saluda el daemon!n"; 
32     sleep(5); 
33 } 
34  
35 // Aki termino la demo, hora de morir 
36 exit("Daemon terminado...n"); 
37 ?>

Si corremos en nuestro Linux el proceso con el siguiente comando:

user@server# php rawdaemon.php

Notaremos como nuestro lindo daemon nos saluda desde las entrañas del mundo en segundo plano, si intentamos matarlo usando Ctrl + C veremos que nuestro intento es frustrado, esto se debe a que nuestro daemon realmente no tiene una consola asociada a él y por lo tanto no puede responder a nuestro mandato, la única manera que podríamos “matarlo” es usando el comando Kill con el número de proceso de nuestro daemon.

Espero que este pequeño artículo les sea de provecho, en la siguiente entrega refinaremos nuestro daemon y le agregaremos mas funciones tratándolo de ser extensible para futuros usos, mientras tanto pueden escribirme sus dudas (si tienen alguna claro).

Feliz navidad y que la paz del Señor todopoderoso esté con ustedes!.

6 comentarios to “Escribiendo daemons en PHP (Parte I)”

  1. victuxgt said

    Demonios! ya me salió! esta bueno ese tu tutorialcito.

  2. Daemons en PHP.. quién se hubiera imaginado. Como vos decís, este es un artículo de “¿cómo se haría?” sería interesante ver un artículo con los pros y contras del implementar daemons en PHP.

  3. kementeus said

    Yep, se trata de un artículo de “vaya, no me hubiera imaginado que eso se podría hacer”. Ahora en cuanto a pros y contras creo que el único pro para el programador sería el no tener que lidiar con otro lenguaje a la hora de implementar una solución completa. Claro, en mi caso la mayor parte (sino toda) la programación de sistemas para Linux la he hecho usando Python (rulez!) o Perl (sometimes). Como te digo, no es mi papel el decir si es mejor o no, a mi criterio si hace lo que quieres hacer esta bien ya q te complicarías menos.

  4. Juan Pablo Rojas said

    Saludos…..!!!

    Realmente es muy explicativo el artìculo, realmente bueno; sin embargo tengo algunas inquietudes que quisiera mencionarte.

    En la actualidad estoy encargado de un pequeño proyectico donde debo recuperar informaciòn sobre detallles de facturas conectandome de forma remota a ciertas sucursales usando soap y xml como medio de intercambio de informaciòn.
    Para automatizar el proceso pienso hacer un demonio, pero me pregunto cual podrìa ser la mayor ventaja de realizar el demonio en lenguaje script y no hacerlo directamente sobre linux.
    Otra cosa tal vez es pedir demasiado, en el ejemplo se ve que existe relaciòn entre la codificaciòn y la arquitectura del sistema , es posible tener un demonio multiplataforma es decir independiente del SO

    Saludos

  5. […] crear desde scripts que automaticen nuestras copias de seguridad desde el demonio cron, hasta un demonio en si mismo que salude al mundo cada 5 minutos, pasando por aplicaciones completas, incluso con interfaz de […]

  6. isroco said

    Me parece muy bien este tutorial, pero me gustaria saber si tienes estos procesos hechos en script, ya que no tengo el PHP, mi SO es Fedora 4 y lo tengo en una maquina virtual.
    Espero me puedas ayudar…

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

 
A %d blogueros les gusta esto: