2010-09-21 20 views
5

Consulte también Having a PHP script loop forever doing computing jobs from a queue system, pero eso no responde todas mis preguntas.Haga que un script PHP se ejecute para siempre, acceda a una cola

Si quiero ejecutar un script PHP para siempre, para acceder a una cola y haciendo trabajos:

  1. ¿Cuál es el potencial de problemas de memoria? ¿Cómo evitarlos? (cualquier función de descarga o algo que debería usar?)

  2. ¿Qué pasa si el script muere por alguna razón? ¿Cuál sería un buen método para iniciarlo automáticamente de nuevo?

  3. ¿Cuál sería el mejor enfoque básico para iniciar el script? Como funciona para siempre, no necesito cron. ¿Pero cómo lo inicio? (Consulte también 2.)

+0

1. Depende de lo que esté haciendo. Algunas extensiones tienen algunas filtraciones graves de mem. - 2. Utiliza algún tipo de guardián. - 3. tenedor() en el fondo. – halfdan

+0

¿Qué exactamente va a estar ocupado haciendo para siempre? ¿Cómo es que * siempre * va a tener trabajo que hacer? Cuando agota su cola, ¿qué hace entonces? ¿Y por qué PHP? – Dolph

Respuesta

9

Configure la cola como una secuencia de comandos cron. Haz que se ejecute cada 10 segundos. Cuando se inicia la secuencia de comandos, compruebe si hay un archivo de bloqueo presente (algo así como .lock). Si hay, salir inmediatamente. Si no, crea el .lock y comienza el procesamiento. Si se produce algún error, envíe un correo electrónico o registre estos errores, elimine .lock y exit. Si no hay tareas, entonces salga.

Creo que este enfoque es ideal, ya que PHP no está diseñado para ejecutar un script durante largos períodos de tiempo como el que está pidiendo. Para evitar posibles pérdidas de memoria, bloqueos, etc., la ejecución continua del script es un mejor enfoque.

+0

Suena genial, tal vez debería también reescribir mi daemon de esta manera. aclamaciones. –

+0

+1 Uso este enfoque. Es simple y efectivo. – goat

0

No va demasiado lejos con las máquinas de estado, al menos es una buena idea introducir estados tanto en 'trabajos' (ejemplo: conversión flv2avi) como en 'tareas' (flv2avi 1.flv).

En mi script (Perl), a veces los procesos zombies están empezando a degradar el rendimiento de todo el script. Es un caso raro, pero es originario de la fuente, por lo que la secuencia de comandos debería poder dejar de leer la cola, permitiendo que la nueva instancia continúe con sus tareas &jobs;, sin embargo, mantener la mayor cantidad de datos de las tareas en ejecución es bienvenido. Una vez que la primera instancia tiene 1-2 tareas, se mata.

En el arranque: comprobación de errores comunes (debido a un apagado) comprobación de errores conocidos (sin espacio, no puede leer la entrada) matanza diga lo que se mató y establecer el estado de 'espera' empezar todo de espera .

Si ejecuta un trabajo por tuberías (vlc | ffmpeg, tail -f | grep), puede intentar evitar el uso de demasiadas E/S en su programa, en lugar de hacer fork() (¿mala idea para PHP?) O simplemente llamando a/bin/bash -c "prog1 | prog2", esto ahorra una gran cantidad de carga de la CPU.

puntos de inicio: tanto /etc/rc.d y cron (comprobar los procesos, dirigidos primera instancia || ejecutar en segundo lugar con el argumento 'depuración')

1

Mientras PHP puede acceder (publicar y consumir) de MQ, si al todo lo posible intente usar una aplicación MQ completamente funcional para hacer esto.

Una aplicación MQ totalmente funcional (en ruby, perl, .NET, java, etc.) manejará todos los problemas de simultaneidad, registro de errores, administración de estado y escalabilidad que usted debata.

Cuestiones relacionadas