2009-03-18 11 views
10

Estoy trabajando en un sitio web de procesamiento de imágenes, en lugar de tener trabajos largos para mantener el navegador de los usuarios Quiero que todos los comandos vuelvan rápido con una identificación de trabajo y que una tarea en segundo plano haga el trabajo real. La identificación se podría usar para verificar el estado y los resultados (es decir, una url de la imagen procesada). He encontrado muchos gestores de colas distribuidas para ruby, java y python, pero no conozco lo suficiente de ninguno de esos idiomas para poder usarlos.¿Cuáles son algunos buenos gestores de colas distribuidos en php?

Mis propias pruebas han estado con la base de datos mysql compartida para poner trabajos en cola, bloquearlos a un trabajador y marcarlos como completados (guardando los datos de retorno en el db). Era solo un prototipo desordenado, y todo el tiempo sentí como si estuviera reinventando la rueda (y no muy elegantemente). ¿Existe algo en php (o que pueda hablar con RESTfully?) Que pueda usar?

Leyendo un poco más, he encontrado que lo que estoy buscando es un sistema de colas que tiene una API api, no tiene que estar escrito en php. Solo encontré clases para usar con SQS de Amazon, pero no solo eso no es gratis, también es bastante latente a veces (más de un minuto para que aparezca un mensaje).

Respuesta

5

¿Has probado ActiveMQ? Hace mención al soporte de PHP a través del protocolo Stomp. Los detalles están disponibles en the activemq site.

Sin embargo, he sacado mucho provecho de la base de datos acerca de su descripción, así que no me preocuparía demasiado por eso.

3

¿Tiene control total sobre el servidor?

La cola de MySQL podría estar bien en tal caso. Tenga un script PHP que se ejecute constantemente (en un ciclo while sin fin), consulte la base de datos MySQL para nuevas "tareas" y sleep() ing para reducir la carga en tiempo de inactividad.

Cuando se completa cada tarea, márquela en la base de datos y pase a la siguiente.

Para evitar que todo se detenga si su secuencia de comandos falla/existe (desbordamiento de memoria PHP, etc.) puede, por ejemplo, colocarlo en inittab (si utiliza Linux como servidor) e init lo reiniciará automáticamente.

+1

Me gusta el enfoque inittab - php tiende a perder memoria con el tiempo por lo que morir una vez por minuto podría no ser una mala idea – reconbot

+0

Uso un script de shell que al final hace un 'exec $ 0' para volver a ejecutarlo . El cliente puede salir a voluntad y reiniciarse. –

2

Zend_Framework tiene una clase de cola, con varias implementaciones de Mysql-backed, SQS y algunos otros back-ends.

Personalmente, he tenido excelentes resultados recientemente con BeanstalkD, que también tiene un cliente PHP. Solo estoy serializando algunos datos con JSON para incluirlos, que se decodifican y ejecutan en el o los trabajadores.

Cuestiones relacionadas