hilos - Procesamiento asincrónico o colas de mensajes en PHP(CakePHP)
php multiprocessing (4)
Estoy construyendo un sitio web en CakePHP que procesa los archivos cargados a través de una API XML-RPC y a través de una interfaz web. Los archivos deben ser escaneados por ClamAV, las miniaturas deben ser generadas, etcétera. Todo el trabajo de recursos intensivos que lleva un tiempo para el cual el usuario no debería tener que esperar. Por lo tanto, estoy buscando un procesamiento asincrónico con PHP en general y CakePHP en particular.
Me encontré con el plugin MultiTask para CakePHP que parece prometedor. También encontré varias implementaciones de cola de mensajes como dropr y beanstalkd . Por supuesto, también necesitaré algún tipo de proceso en segundo plano, probablemente implementado con un Cake Shell de algún tipo. Vi MultiTask usando PHP_Fork para implementar un daemon de PHP multiproceso.
Necesito algunos consejos sobre cómo encajar todas estas piezas juntas de la mejor manera.
- ¿Es una buena idea tener un daemon de larga ejecución escrito en PHP? ¿Qué debería tener cuidado?
- ¿Cuál es la ventaja de las implementaciones de cola de mensajes externos? El complemento MultiTask no usa una cola de mensajes externa. Se enrolla usando una tabla MySQL para almacenar tareas.
- ¿Qué cola de mensajes debo usar? dropr? Beanstalkd? ¿Algo más?
- ¿Cómo debería implementar el procesador back-end? Es una bifurcación del daemon PHP una buena idea o simplemente está buscando problemas?
Mi plan actual es usar el plugin MultiTask o editarlo para usar beanstald en lugar de su propia implementación de tabla MySQL. Los trabajos en la cola pueden consistir simplemente en un nombre de tarea y una matriz de parámetros. El daemon de PHP miraría los trabajos entrantes y los pasaría a uno de sus subprocesos secundarios. Simplemente ejecutaría la Tarea CakePHP con los parámetros dados.
¿Alguna opinión, consejo, comentarios, errores o llamas sobre esto?
¿Qué hay de Gearman? Buen soporte e integración en php y características como tareas paralelas, escalado, monitoreo, etc.
¿También valdría la pena visitar Amazon SQS para usarlo junto con EC2?
Si usa una cola de mensajes como beanstalkd, puede iniciar tantos procesos como desee (incluso en el mismo servidor). Cada proceso de trabajo tomará un trabajo de la cola y lo procesará. Puede agregar más trabajadores y más servidores si necesita más capacidad.
Lo bueno de utilizar un único trabajador con subprocesos es que no tiene que ocuparse de la sincronización dentro de un proceso. La cola de trabajo se asegurará de que ningún trabajo se manejará dos veces.
He obtenido excelentes resultados con BeanstalkD y un back-end escrito en PHP para recuperar trabajos y luego actuar sobre ellos. Envolví la ejecución de trabajo real en un script bash para seguir funcionando aunque fuera si salía (a menos que haga una '' exit(UNIQNUM);
'', cuando el script lo verifique y realmente salga). De esta forma, el script PHP reiniciado borra cualquier memoria que pueda haber sido utilizada, y puede comenzar de nuevo cada 25/50/100 trabajos que ejecuta.
Un par de las ventajas de usarlo es que puedes establecer prioridades y retrasos en un trabajo de BeanstalkD: "ejecuta esto con una prioridad menor, pero no comiences durante 10 segundos". También he puesto en cola una serie de trabajos en algún momento (ejecuta esto ahora, en 5 segundos y nuevamente después de 30 segundos).
Con la configuración de red adecuada (y ejecutarla en una dirección IP accesible para el resto de su red), también puede ejecutar un deamon beanstalkd en un servidor, y hacer que lo sondee desde varias máquinas más, de modo que si hay un gran número de tareas que se generan, el trabajo se puede dividir entre servidores. Si un conjunto particular de tareas necesita ejecutarse en una máquina en particular, he creado un ''tubo'' que es el nombre de máquina de esa máquina, que debe ser único dentro de nuestro clúster, si no globalmente (útil para cargas de archivos). Descubrí que funcionaba perfectamente para cambiar el tamaño de la imagen, a menudo devolviendo las imágenes más pequeñas al sistema de archivos antes de que la página web que se refiere a ella se refiriera a la URL a la que llegaría.
De hecho, estoy a punto de comenzar a escribir una serie de artículos sobre este tema para mi blog (incluidas algunas técnicas para el código que ya he enviado varios millones de solicitudes en vivo): mi URL está vinculada desde mi perfil de usuario aquí, en .
(He escrito una serie de artículos sobre el tema de Beanstalkd y cola de trabajos)