2010-12-21 26 views
5

¿Cuál es la forma correcta de ejecutar las tareas de Symfony en un proceso separado? Mi primera suposición sería usar fork/exec, pero de acuerdo con this, no se puede hacer con nada que mantenga abiertos los descriptores de archivos o las conexiones (como MySQL). Entonces eso no suena como una opción. Otra alternativa es hacer exec('symfony taskname &'), pero eso parece un truco. ¿Es eso lo mejor que puedo hacer? Hay una tercera forma?¿Cómo ejecutar correctamente una tarea de Symfony en el fondo de una acción?

+0

La función pcntl_fork solo funciona para la versión cgi de php. Si está ejecutando php a través de apache es un no ir. Usar exec es prácticamente la única forma de hacerlo con apache, pero definitivamente es feo y debe ejecutarse silenciosamente para ejecutarse al mismo tiempo. – Jestep

+0

Me llevó mucho tiempo descubrir que debe redirigir la salida estándar a un archivo para que realmente se ejecute. ¿Es eso lo que quieres decir con "correr silenciosamente"? –

Respuesta

3

Así es como terminé haciéndolo:

exec('nohup ' . sfConfig::get('sf_root_dir') . '/symfony TASKNAME >/dev/null &'); 

Usted tiene que redirigir la salida estándar, o de lo contrario no se ejecutará en segundo plano (aunque usted no tiene que usar/dev/null si querer la salida real). En mi caso, configuré todas mis tareas para usar el registrador de archivos de Symfony, así que no fue un problema.

Todavía estoy buscando una mejor solución. Esto parece un truco.

-8

Php no sabe multithreading.
Y sí, es un gran defecto en php IMO.
Hay una forma de hacer subprocesos múltiples, pero no se recomienda. Es complejo, y es feo y pregunta, no pide problemas.

Por lo tanto, creo que lo mejor que puede hacer es algo así como un ejecutivo, o algo así como llamar a un servicio web como llamar?

+0

¿Qué? http://php.net/manual/en/book.pthreads.php (Oh, es 2010) :) – Nicklasos

4

La forma en que esto se maneja generalmente es usar una cola de tareas. Cuando desee hacer un proceso en segundo plano, agréguelo a una cola de algún tipo (podría usar su base de datos, o podría usar un daemon de cola real como beanstalkd). Luego tiene algunos procesos desmembrados cuyo trabajo es sacar el trabajo de la cola y realizarlo.

Cuestiones relacionadas