2009-03-14 17 views
22

Deseo crear un proceso en segundo plano y me han dicho que generalmente están escritos en C o algo por el estilo. Recientemente descubrí que PHP se puede usar para crear un daemon y esperaba obtener algún consejo si debería hacer uso de PHP de esta manera.¿Es aconsejable usar PHP para un daemon?

Aquí están mis requisitos para un daemon.

  • continuamente comprobar si una fila ha sido añade a la tabla de base de datos MySQL ordena
  • Run FFmpeg en lo que se recuperados de la base de datos
  • salida de inserción en la tabla de MySQL

no estoy seguro qué más puedo ofrecer para ayudar a tomar esta decisión. Solo para agregar, no he hecho C antes. Solo Java y PHP y bash scripting básico.

¿Tiene una gran diferencia de rendimiento?

Tenga en cuenta mi ignorancia, estoy aprendiendo! :)

Gracias todos

+0

¡Hay un montón de idiomas "entre" PHP y C! Si PHP no funciona (y es un lenguaje engorroso para tal tarea), puede encontrar que Python o cualquier otra cosa que generalmente se considere 'confiable' más rápido que C. –

Respuesta

28

Como han notado otros, varias versiones de PHP tienen problemas con sus recolectores de basura. Por supuesto, si sabes que tu versión no tiene tales problemas, eliminas ese problema. El punto es que usted no sabe (por seguro) hasta que escriba el daemon y lo ejecute a través de valgrind para ver si el PHP instalado se escapa o no en una máquina determinada. Entonces, en esa mano, puedes escribirlo solo para descubrir que lo que Zend piensa que es fijo aún podría tener errores, o estás lidiando con una versión un poco más vieja de PHP o alguna extensión. Icky.

El otro problema son las señales con errores. En mi experiencia, los manejadores de señal no siempre se ingresan correctamente con PHP, especialmente cuando la señal está en cola en lugar de fusionarse. Eso puede no ser un problema para usted, es decir, si solo necesita manejar SIGINT/SIGUSR1/SIGUSR2/SIGHUP.

Por lo tanto, propongo:

Si el demonio es simple, seguir adelante y utilizar PHP. Si parece que va a ser bastante complejo, o asignar mucha memoria, puede considerar escribirla en C después de crear un prototipo en PHP.

Soy una persona bastante dura. Sin embargo, no veo nada de malo en hacer algo rápido usando PHP (más allá de los casos que expliqué). Tampoco veo nada malo con el uso de PHP para prototipar algo que puede o no reescribirse en C. Por ejemplo, manejar las cosas de la base de datos va a ser mucho más simple si usas PHP, frente a la administración de devoluciones de llamadas usando otras interfaces en C. Entonces esa instancia, para un 'one off', seguramente lo hará mucho más rápido.

0

No lo recomendaría. PHP no está diseñado para la ejecución a largo plazo. Está diseñado principalmente con páginas de corta duración.

En mi experiencia PHP puede tener problemas con la fuga de memoria para algunas de las tareas más grandes.

+1

La recolección de basura de PHP es excelente siempre que planee adecuadamente su alcance. – Nolte

+0

bien, además de las estructuras de matrices autorreferenciales, donde se filtra la memoria y arroja mensajes a la consola. woops. –

17

Me inclinaría a realizar esta tarea con un trabajo cron, en lugar de sondear la base de datos en un daemon.

Es probable que su comando FFmpeg tarde un tiempo en hacerlo, ¿no? En ese caso, ¿es realmente necesario sondear constantemente la base de datos? ¿No sería una manera más simple de lograr lo mismo ejecutar un cronjob cada minuto (o cada cinco, diez o veinte minutos)?

+0

Buena línea de pensamiento. Pero por lo que entiendo, el daemon continuará creando un proceso hijo para cualquier cosa nueva que se agregue a la base de datos. Por lo tanto, FFmpeg puede tomar todo el tiempo que quiera y esto no importaría, ¿verdad? – Abs

+0

Puede consultar utilizando launchd (próximo gen cron) –

+2

Depende del nivel de actividad. Iniciar un proceso es mucho más pesado que ejecutar un temporizador en un solo proceso, además de que necesita agregar lógica para hacer frente a múltiples trabajos si es demasiado frecuente.El trabajo cron va a necesitar duplicar la lógica de sondeo en cualquier caso. – dkretz

7

Php no es mejor o peor para este tipo de cosas que cualquiera de los otros lenguajes de scripting comunes. Tiene acceso bastante completo a todas las llamadas al sistema y las utilidades de la biblioteca que necesitaría para hacer este tipo de trabajo. Si está más cómodo usando PHP para scripting, entonces php hará el trabajo por usted.

El único inconveniente es que php no es tan ubicuo como, por ejemplo, perl o python, que está instalado en casi todos los sabores de Unix. Php solo se encuentra en sistemas que van a servir contenido web dinámico. No es que un intérprete Php sea demasiado grande o costoso de instalar también, pero si su mayor preocupación es llevar su programa a muchos sistemas, eso puede ser un obstáculo leve.

+0

La mayoría de las distribuciones incluyen PHP tanto como Perl y Python –

+2

Sí, pero no tan a menudo instalado por defecto. – SingleNegationElimination

1

Es posible que desee considerar hacer un mysql trigger que ejecute un comando system (es decir, FFmpeg) en lugar de un daemon. Si un retraso no es un problema, también puede poner algo en cron que se ejecute cada pocos minutos para verificar. Cron sería mi elección, si es una opción.

Para responder a su pregunta, php está perfectamente bien para ejecutar como daemon. No tiene que hacerse en C.

+0

Ah, no sabía acerca de los disparadores de mysql. Sí, la tarea cron también es una opción, así que ahora mysql se activa. :) – Abs

+0

Mala idea en general: los desencadenantes serían sincrónicos, agregando bloqueos durante la duración de una transacción; hacen que las transacciones demoren más (obviamente); y son más difíciles de probar y depurar. – dkretz

+0

Estoy de acuerdo con el disparador, solo lo mencioné como una alternativa a un daemon. En realidad, no sería tan malo si solo genera un nuevo proceso y sale. Mi preferencia probablemente sea usando cron. – gpojd

1

Si combina las respuestas de Kent Fredric, tokenmacguy y Domster obtendrá algo útil.

php probablemente no sea bueno para tiempos de ejecución largos, así que vamos a mantener cada ciclo de ejecución corto y asegurarnos de que el sistema operativo se encargue de la limpieza de cualquier tipo de pérdida de memoria. Como una herramienta para iniciar su script php cron puede ser una buena herramienta. Y si lo haces así, no hay mucha diferencia entre los idiomas.

Sin embargo, la pregunta todavía está en pie. ¿Es php incluso capaz de ejecutarse como un daemon normal durante largos períodos de tiempo (algunos años)? ¿O una variedad de lápices de memoria devorará todo su ram y matará al sistema?

/Johan

0

una tarea programada y un poco de secuencias de comandos de bash debería ser todo lo que necesita por los sonidos de la misma. Puede hacer cosas como:

$file=`mysqlquery -h server < "select file from table;"` 
ffmpeg $file -fps 50 output.a etc. 

Así que bash sería más fácil de escribir, portar y mantener en mi humilde opinión que utilizar PHP.

6

Voy a ser contrario y recomiendo probar el daemon php. Aparentemente es el idioma que conoces mejor. Probablemente incorpore un temporizador en cualquier caso, para que pueda duplicar la frecuencia de consultas en la base de datos. En realidad, no hay penalización, siempre y cuando no estés haciendo una búsqueda ingenua de una consulta.

Si se trata de algo que no se ejecuta con frecuencia, puede ejecutar alternativamente el php de cron, permitiéndole a usted o al código drenar la cola y luego morir.

Pero no tenga miedo de quedarse con lo que mejor sabe, como primera aproximación.

Intente no utilizar activadores. Impondrán un acoplamiento innecesario, y no es divertido probarlos y depurarlos.

1

Si lo hace, preste atención a las pérdidas de memoria. PHP 5.2 tiene algunos problemas con su recolector de basura, de acuerdo con this (reparado en 5.3). Quizás es mejor usar cron, por lo que el script comienza limpio cada vez que se ejecuta.

-2

Cron job? Sí.

Daemon que se ejecuta para siempre? No.

PHP no tiene un recolector de basura (o al menos, la última vez que lo revisé no lo hizo). Por lo tanto, si crea una referencia circular, NUNCA se limpia, al menos no hasta que finalice la ejecución del script principal. En el proceso daemon esto es aproximadamente nunca.

Si han agregado un GC en nuevas versiones, entonces sí puede.

2

Al funcionar como un trabajo cron con una periodicidad determinada con sensatez, un script PHP puede hacer el trabajo, y la estabilidad de la producción es ciertamente alcanzable. Es posible que desee limitar el número de instancias FFMpeg simultáneas y asegúrese de tener un registro completo de la aplicación y manejo de excepciones. Implementé continuamente procesos de sondeo en Java, así como el script cron'd PHP cada diez minutos, y ambos hacen el trabajo muy bien.

+0

Hola Karim, gracias por esa respuesta. :) – Abs

1

Por lo que has descrito, me gustaría ir con un daemon. Asegúrese de quedarse dormido en el ciclo de votación, para no bombardear la base de datos cuando no haya nuevas tareas. Un cronjob funciona mejor para el flujo de trabajo/tipo de informe de trabajos, donde no hay un evento particular que desencadena la siguiente ejecución.

Como se mencionó, PHP tiene algunos problemas con la gestión de la memoria.Debe asegurarse de probar su código para detectar fugas de memoria, ya que se acumularían con el tiempo, en un script de ejecución larga. PHP no tiene una recolección de basura real. Se basa en el recuento de referencias, lo que significa que las referencias cíclicas causarán fugas. Si eres consciente de esto, puedes codificarlo.

3

Un cron-job probablemente funcionaría muy bien, si no se requieren acciones casi instantáneas.

Estoy a punto de poner en marcha, un sistema que he creado, basado en el daemon de cola 'beanstalkd'. Envío varios mensajes pequeños desde (en este caso, PHP) llamadas a la página web al daemon, y un script PHP luego los recoge de la cola y realiza varias tareas, como cambiar el tamaño de las imágenes o verificar las bases de datos (a menudo devolviendo información a través de un Memcache tienda basada en)

Para evitar procesos de larga ejecución, lo he envuelto en un script BASH, que, dependiendo del valor devuelto por el script ("exit (1);") reiniciará el script, para cada (digamos) 50 tareas que se realizan. Si se reinicia porque lo planeo, lo hará instantáneamente, cualquier otro valor de salida (el valor predeterminado es 0, así que no lo uso) se detendrá unos segundos antes de que se reinicie.

+0

Gracias por su ejemplo. – Abs

-4

Hazlo. Tuve que hacerlo una vez también. Al igual que otros dijeron, no es ideal, pero va a ser ... er hecho. Usando Windows, ¿verdad? Bueno.

Si solo necesita ejecutar ocasionalmente (Una vez por hora, etc.). Crea un nuevo acceso directo a tu Firefox, colócalo en algún lugar relevante. Abra las propiedades para el acceso directo, el cambio "destino" a:

"C:\Program Files\Mozilla Firefox\firefox.exe" http://localhost/path/to/script.php 

Ir a Panel de control> Tareas programadas punto su nueva tarea programada en el acceso directo.

Si necesita que se ejecute constantemente o pseudo constantemente, tendrá que darle un poco de picante al script.

Comience el guión con

set_time_limit(0); 
ob_implicit_flush(true); 

Si la secuencia de comandos utiliza un bucle (como mientras) tiene que borrar el búfer:

$i=0; 
while($i<sizeof($my_array)){ 
    //do stuff 
    flush();   
    ob_clean(); 
    sleep(17); 
    $i++; 
} 
+2

El hombre este enfoque es muuuy malo ... – loostro

3

Un problema con daemonizing adecuadamente un script PHP es que PHP no tiene interfaces para las llamadas de sistema dup() o dup2(), que son necesarias para separar los descriptores de archivo.

1

Si lo hace decidido a seguir el camino de demonio, hay una gran módulo PEAR llamada System_Daemon la que he utilizado con éxito recientemente en una instalación de PHP V5.3.0. Está documentado en la autores de blog: http://kevin.vanzonneveld.net/techblog/article/create_daemons_in_php

Si ha instalado PERA, puede instalar este módulo usando:

pear install -f System_Daemon 

También tendrá que crear un script de inicialización: /etc/init.d/<your_daemon_name>

A continuación, puede:

  • Iniciar el demonio: /etc/init.d/projNotifMailDaemon start
  • Sto p Daemon: /etc/init.d/projNotifMailDaemon stop

Los registros son almacenados en: /var/log/<your_daemon_name>.log

+0

V. útil. Gracias por el enlace y el poco acerca de cómo iniciar y detener los scripts. – Joe

0

Si sabe lo que está haciendo seguro. Debes entender bien tu sistema operativo. PHP generalmente no es adecuado para la mayoría de los daemons porque no está enhebrado y no tiene un sistema basado en eventos decente para todas las tareas. Sin embargo, si satisface sus necesidades, entonces no hay problema. PHP moderno (5.3+) es realmente estable y no tiene pérdidas de memoria. Mientras habilite el GC y no implemente sus propias pérdidas de memoria, etc. estará bien.

Aquí están las estadísticas de un daemon que estoy ejecutando: uptime 17 días (último reinicio debido a la actualización de PHP). bytes escritos: 200 GB conexiones: cientos conexiones a manejarse, cientos de miles artículos/solicitudes procesadas: millones

Node.js es generalmente más adecuados, aunque tiene algunas molestias menores. Se han realizado algunos intentos para mejorar PHP en las mismas áreas, pero en realidad no son tan buenos.

Cuestiones relacionadas