2011-10-17 9 views
5

Estoy trabajando en una aplicación que utiliza la API MWS de Amazon escrita principalmente en PHP. Esta aplicación permite a los vendedores de Amazon suscribirse, proporcionar algunas credenciales de Amazon y la aplicación luego comienza a descargar los pedidos de este usuario de Amazon colocándolos en una base de datos MySQL.¿Cuál es la forma más eficiente de ejecutar funciones asíncronas en PHP?

He creado los métodos para sincronizar datos con precisión en la base de datos utilizando un script con varias funciones, pero me di cuenta de que esto lleva demasiado tiempo. Esta secuencia de comandos simplemente recorre todos los usuarios de la base de datos e itera todas las órdenes de a una por vez. En este momento, con solo 5 usuarios de prueba, el tiempo es factible pero estoy buscando un método más extensible. Piense en aproximadamente 500 usuarios que ejecutan sincrónicamente uno a la vez. ¡Demasiado tiempo!

Soy bastante nuevo en PHP y especialmente ejecuto procesos asincrónicos desde él. La única forma en que descubrí que puedo hacer esto es tener un script de inicio que encuentre todos los usuarios en la base de datos y genere un script de sincronización para cada usuario y luego lo libere. No me gusta esta idea porque si tuviera más de 500 usuarios, mi sincronización nocturna consistiría en 500 instancias generadas de este script PHP.

¿Alguien ha hecho algo similar a esto antes? Si es así, me encantaría saber cómo hacer que esta sincronización sea más eficiente.

Respuesta

1

de acuerdo w/DaveRandom, echa un vistazo a petición HTTP piscina para su aplicación, en lugar de rodar su propia http://www.php.net/manual/en/class.httprequestpool.php

+0

Nunca escuché sobre la clase HTTPRequestPool. ¡Gracias!Sin embargo, a partir de esto pude averiguar cómo hacer que envíe solicitudes HTTP asíncronas, pero también necesito procesar cada resultado que obtengo de estos por separado. ¿Podría hacerse esto? –

+0

Creo que sí. ¿Has leído los Documentos? Especialmente revise el método "getFinishedRequests" - http://www.php.net/manual/en/function.httprequestpool-getfinishedrequests.php – rICh

2

A partir de PHP no puede ser multi-hilo , en la práctica sólo tiene 2 opciones (hay varios métodos para hacer esto, pero todas se reducen a la siguiente para las categorías):

  • Tener 1 proceso por operación de usuario. Como dices, con una gran base de datos, esto podría generar muchos procesos.
  • Tienen un proceso que trata con más de un usuario. Esto tomará potentialy más tiempo, ya que cada proceso es efectivamente sincrónico.

Creo que la mejor opción es combinar los dos enfoques, por lo que tiene múltiples procesos que tratan con múltiples usuarios. Entonces, si tenía 500 usuarios, engendre 100 procesos que tratan con 5 usuarios cada uno, o 50 procesos que tratan con 10 usuarios cada uno.

Alternativamente, podría valer la pena escribir un programa en un lenguaje que se adapte mejor a la tarea, algo que admite multihilo, como Java o Perl, que puede comenzar desde PHP si es necesario.

Edición 03/2013: PHP puede ahora ser multiproceso, pero no es recomendable para su uso en producción como la extensión pthreads sigue siendo muy inestable, y además no es recomendable para el usuario medio, sólo utilice esto si usted realmente sabe lo que está haciendo

+0

Gracias por la respuesta. Preferiría mantener esto en PHP, ya que toda la aplicación está escrita en PHP, pero puede ser, de hecho, una mejor solución. Este es un gran inconveniente de PHP. :( –

+0

Fuera de interés, ¿cómo está generando los procesos hijos? Con 'pcntl_fork()', 'exec ('php script.php>/dev/null &');' o algún otro método que no se me ocurre en este momento ? – DaveRandom

+0

Todavía no había encontrado una solución definitiva. Sin embargo, mi idea era utilizar la función de ejecución. –

0

terminé usando tránsito y pasando la secuencia de comandos para el fondo. Las cosas parecen estar funcionando bien hasta ahora.

Cuestiones relacionadas