2010-09-01 16 views
5

Tengo algunas secuencias de comandos que deben ejecutarse al mismo tiempo como procesos separados. Mi plan es tener un trabajo cron que ejecute varias instancias de estos scripts en un intervalo establecido. ¿Es esta una buena idea? ¿Cuáles son los pros/contras de este enfoque? ¿Hay alguna otra opción que deba tener en cuenta?PHP Concurrency via Cron

Conclusión: Estoy tratando de imitar el multihilo. Cualquier condición de carrera se manejará por código (por ejemplo, establecer estados en DB, etc.). Se supone que los scripts hacen tareas intensivas de procesamiento (por ejemplo, crear miniaturas, etc.).

Respuesta

5

Puede usar el tenedor. La secuencia de comandos de inicio cargaría todas las configuraciones e inicializaciones predeterminadas y, a continuación, los procesos de fork niño para hacer el procesamiento. Luego podría monitorear los procesos para ver si aún se están ejecutando. http://php.net/manual/en/function.pcntl-fork.php

0

¿PHP no tiene fork()? Si bien eso no es realmente multihilo, es una forma básica de co-rutinas.

2

Bueno, si lo necesita como cronjob, adelante. Si desea múltiples procesos, lo más probable es que desee utilizar pcntl_fork para crear varias instancias del mismo script.

1

Dependiendo de la rapidez con la que desee reaccionar a esos trabajos y si desea realizar tareas intensivas en el procesador, también puede distribuir ese proceso utilizando un sistema de cola. Consulte Gearman o beanstalkd con varios trabajadores por máquina si tiene múltiples núcleos/procesadores.

0

Uno de los usos de cron es que ejecutará una copia de su secuencia de comandos en el intervalo establecido independientemente de cuántos procesos de script ya se estén ejecutando. Esto significa que los scripts necesitan una forma de comunicarse entre sí para que un máximo de N scripts se sigan ejecutando al mismo tiempo (el exceso de scripts puede salir inmediatamente).

Una alternativa a cron podría ser supervisord que ejecutará un número configurable de scripts y supervisará cada uno para que cualquier salida se vuelva a generar.