Considere una aplicación web PHP cuyo propósito es aceptar las solicitudes de los usuarios para iniciar trabajos genéricos asíncronos y luego crear un proceso/subproceso de trabajo para ejecutar el trabajo. Los trabajos no son particularmente intensivos en CPU o memoria, pero se espera que bloqueen las llamadas de E/S con bastante frecuencia. No se deben iniciar más de uno o dos trabajos por segundo, pero debido a los largos tiempos de ejecución, puede haber muchos trabajos ejecutándose a la vez.procesamiento asíncrono con PHP: un trabajador por trabajo
Por lo tanto, es de suma importancia que los trabajos se ejecuten en paralelo. Además, cada trabajo debe ser supervisado por un administrador daemon responsable de matar a los trabajadores colgados, abortar a petición del usuario, etc.
¿Cuál es la mejor manera de implementar un sistema como este? Puedo ver:
- Bifurcar a un trabajador del administrador: esta parece ser la opción de nivel más bajo, y yo tendría que implementar un sistema de supervisión yo mismo. Apache es el servidor web, por lo que parece que esta opción requeriría que cualquier trabajador PHP se inicie a través de FastCGI.
- Use algún tipo de cola de trabajo/mensaje. (gearman, beanstalkd, RabbitMQ, etc.) - Inicialmente, esta parecía ser la elección obvia. Después de algunas investigaciones, estoy algo confundido con todas las opciones. Por ejemplo, parece que Gearman está diseñado para grandes sistemas distribuidos donde hay un grupo fijo de trabajadores ... así que no sé si es lo que necesito (un trabajador por trabajo).
Gracias. He hecho esto algunas veces, y funciona REALMENTE bien. Bueno, debería decir que funciona muy bien si sus casos de uso están alineados con las limitaciones del sistema (el IPC es bastante caro, etc.). Si no están muy bien alineados, debe utilizar una implementación real de subprocesos y un lenguaje distinto de PHP ... – ircmaxell
Sin embargo, tenga cuidado con 'pcntl_fork()'. He tenido problemas con las conexiones de bases de datos que se han compartido de maneras extrañas entre los procesos padre e hijo. No me sorprendería si algunas extensiones PECL comparten peculiaridades similares. Evitaría horquillas en PHP y generaría procesos separados a través de 'exec()' y cosas por el estilo, solo para mantener las cosas simples –
Bueno, explícitamente reabrí todas las conexiones en el niño después de bifurcar por esa misma razón. Bifurcar no es nada de qué temer (lo uso con bastante frecuencia). Pero es mucho ensayo y error, ya que no hay mucha documentación sobre el tema. El problema con la ejecución a través de 'exec' hace que la comunicación y el monitoreo sean mucho más difíciles (ya que para un' exec' es un bloqueo, y dos es mucho más difícil obtener el id. De proceso de una llamada 'exec' sin bloqueo (una llamada con un '&' agregado al final)) ... – ircmaxell