20101119

Crear un demonio con PHP y PEAR

 Hoy tuve la necesidad de crear un demonio para WHObyYOU por lo que voy a compartir con uds el resultado.
Un demonio es un proceso / programa que corre en segundo plano (de forma pasiva). La mayoría de la veces, cuando uno necesita correr un proceso continuamente; termina haciendo tareas programadas (cron jobs) con las ventajas y desventajas de este tipo de implementación. La mayor desventaja de una tarea programada es el solapamiento de la tarea con otra. Hay que hacer alguna magia para que esto no pase.
Con demonios esto no importa ya que una tarea no comienza hasta que empieza la otra (dentro del mismo proceso).

El ejemplo que voy a mostrar ahora es simplemente para mostrarles como hacer el demonio con PEAR::System_Daemon.

Primero hay que instalar pear, en Unbuntu
sudo apt-get install php-pear
Luego instalar PEAR::System_Daemon
sudo pear install -f System_Daemon
Luego de instalar el paquete, lo unico que tenemos que hacer es :
require_once "System/Daemon.php"; // Include the Class
System_Daemon::setOption("appName", "mydaemon");
System_Daemon::start();

A continuación muestro un script de ejemplo, que lo unico que hace es grabar en un log cada 5 segundos con un máximo de 5 veces.



Paso a explicar las diferentes partes del script:

En la línea 1 indicamos que este script se ejecutará con PHP.
En la linea 3 incluimos la clase System_Daemon de par.

En la linea 5 configuramos el demonio, "appName" y "appDir" son los únicos requeridos para que funcione.
$options = array(
    "appName" => "pruebaDiego",
    "appDir" => dirname(__FILE__)
);
Lineas 13 y 14 creo el demonio (crea un proceso hijo, se separa del proceso padre y el proceso padre muere).

Luego creo un while(true) y le genero una condición de salida: podría ser por una falla del programa, captura de una excepción, cualquier cosa. En este caso la condición de salida se da cuando el bucle se ejecutó 5 veces.

En la línea 21 escribo en el log. El System_Daemon nos ofrece una forma simple de escribir un log, en este caso el archivo de log es:
/var/log/pruebaDiego.log
Para ejecutar el script simplemente, hay que ejecutar
$ sudo ./test.php 
Luego podemos ver el log:
$ tail -f /var/log/pruebaDiego.log

Por más información:
  

2 comentarios:

  1. Puedo hacer que un script se ejecute en el momento que éste sea creado en una carpeta?. Por ejemplo:

    Creo un archivo con el script de forma dinámica desde mi aplicación, llamémosle 'scriptCargaUsuarios.php' y lo guardo en una carpeta llamada 'scripts'.

    El Daemon puede identificar cuando esto sucede y lo puede ejecutar?

    Gracias de antemano AV4t4r.

    ResponderEliminar
  2. Leon46, en realidad eso es independiente del demonio, tu demonio puede estar continuamente revisando que exista un script en un directorio (simplemente revisando el filesystem) y ejecutarlo en el momento que lo veo (cuidado con el tema de seguridad acá).

    saludos

    Diego - AV4TAr

    ResponderEliminar