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-pearLuego instalar PEAR::System_Daemon
sudo pear install -f System_DaemonLuego de instalar el paquete, lo unico que tenemos que hacer es :
require_once "System/Daemon.php"; // Include the ClassSystem_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.
Lineas 13 y 14 creo el demonio (crea un proceso hijo, se separa del proceso padre y el proceso padre muere).$options = array("appName" => "pruebaDiego","appDir" => dirname(__FILE__));
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.logPara ejecutar el script simplemente, hay que ejecutar
$ sudo ./test.phpLuego podemos ver el log:
$ tail -f /var/log/pruebaDiego.log
Por más información:
- http://pear.php.net/package/System_Daemon/docs
- http://kevin.vanzonneveld.net/techblog/article/create_daemons_in_php/
Puedo hacer que un script se ejecute en el momento que éste sea creado en una carpeta?. Por ejemplo:
ResponderBorrarCreo 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.
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á).
ResponderBorrarsaludos
Diego - AV4TAr