2010-04-07 21 views
6

He programado un trabajo CRON para que se ejecute cada 4 horas, lo que requiere recopilar información de cuentas de usuario. Ahora quiero acelerar las cosas y dividir el trabajo entre varios procesos y usar un proceso para actualizar el DB MySQL con los datos recuperados de otros procesos.Grupo de subprocesos PHP?

En JAVA sé que hay un grupo de subprocesos al que puedo dedicar algunos hilos para realizar algún trabajo.

¿cómo lo hago en PHP?

Cualquier consejo es bienvenido.

Gracias

+0

¿Qué ejecuta la tarea cron? ¿Un script de shell y/o php y/o una solicitud de página para el servidor que ejecuta un script php? – zaf

+0

Un script PHP que usa la biblioteca curl para analizar algunos datos de cuentas de usuario. – embedded

Respuesta

1

Como han dicho otros, los procesos que se bifurcan es más fácil que el desove hilos con PHP. ¿Pero por qué crees que tener una única secuencia dedicada para escribir los resultados en la base de datos es una buena idea? Aunque esto es un poco más fácil de hacer con los hilos que con los procesos, sigue siendo una sobrecarga compleja que no parece agregar ningún valor al objetivo general.

De hecho, es mucho más simple iniciar varias instancias del script (con algún parámetro para particionar los datos) desde cron en lugar de iniciar un fork desde dentro del código PHP, y no molestar con ningún cuello de botella para registrar los datos de vuelta a la base de datos.

C.

+0

Esa es una buena opción que IMO es mucho mejor que los procesos de bifurcación. ¿Tiene alguna idea de cómo particionar los datos y cuántas instancias debo ejecutar para no sobrecargar el sistema? Estoy pensando en 3 instancias. – embedded

+0

tantas instancias como desee. Si los datos están identificados por un número de secuencia o algún otro numérico, entonces use MOD para obtener cada enésimo caso, p. 'SELECT * FROM mytable WHERE MOD (id, $ number_of_instances) = $ this_instance_id' (recuerde ejecutar una instancia número 0) – symcbean

+0

gracias Echaré un vistazo a la opción MOD. – embedded

6

PHP no es probablemente el lenguaje más adecuado para multi-threading.

Es posible que desee echar un vistazo a las diferentes soluciones. Por ejemplo, Thrift le permite tener un front-end de PHP hablando con un back-end de Java, donde podría implementar fácilmente su comportamiento deseado.

Si todavía quiere hacer esto en PHP, es posible que desee echar un vistazo a:

http://www.php.net/pcntl

http://www.electrictoolbox.com/article/php/process-forking/

0

Entrada estos mensajes - * http://www.alternateinterior.com/2007/05/multi-threading-strategies-in-php.html * http://www.electrictoolbox.com/article/php/process-forking/

Básicamente necesita compartir datos entre procesos y, como veo, probablemente necesite escribir en algún archivo primero. Recupere usando el proceso principal (conviértalo en un proceso tipo Ajax-Polling) y escriba a DB.

+0

¿qué quiere decir con el proceso de tipo ajax-polling? Creo que voy a tomar su camino y tenedor algunos procesos para hacer la tarea y anexar el resultado en el archivo. El proceso principal se ha podido recuperar todos los registros disponibles en el momento en el archivo, borra el archivo y luego libera el bloqueo y los procesará. voy a utilizar un bloqueo en el archivo dedicado para evitar el acceso al archivo mulpile. ¿Qué opinas sobre este comportamiento? – embedded

+0

Ese comportamiento es exactamente lo que viene a mi mente. en su caso, dado que es cron-job, seguirá ejecutándose en intervalos específicos y reunirá datos del archivo y luego escribirá en DB. Ajax-polling será para un enfoque de servidor web en el que use javascript para realizar solicitudes ajax en lugar de cron. – pinaki

+0

Creo que implementaré esto y lo usaré cuando vea que la ejecución de mi trabajo de cron demora más de 4 horas. En términos de alojamiento web, ¿debo asegurarme de que la biblioteca pcntl esté habilitada? – embedded

0

Puede desembolsar nuevos procesos en PHP también: pcntl_fork()

cierto. ¿ese script se ejecuta más de 4 horas? De lo contrario, no veo ninguna razón para complicarlo con la gestión de subprocesos o procesos.

+0

Esto se puede cambiar dinámicamente. depende de la cantidad de usuarios que usan mi servicio. voy a utilizar este mecanismo sólo cuando la ejecución del script será de más de 4 horas – embedded

2

PHP y subprocesos (estas 2 palabras) no pueden ir juntos en la misma oración. PHP no ofrece soporte de subprocesos. Puede probar los mecanismos de bifurcación de pcntl o el procesamiento asíncrono que en su caso no es útil.

Puede usar un mecanismo de distribución de carga de trabajo que podría ser lo que desea si echa un vistazo a Gearman (sugiera que lo busque en google).

Según lo descrito por otros "es una máquina de horquilla distribuida" que puede ofrecer la distribución de carga de trabajo que está buscando para "acelerar".

cordiales,

+0

voy a echar un vistazo en ella. ¿Los proveedores de alojamiento web respaldan este kit? – embedded

+0

Es solo una lib que instala - servidor y cliente - inicia el deamon y está listo para aceptar solicitudes de procesamiento (muy recomendable para distribuir la carga de trabajo) - http://gearman.org/ - revise las presentaciones también – Andreas

+0

I Creo que esto es mucho más de mis necesidades. Implementaré mi propio mecanismo. Gracias – embedded

Cuestiones relacionadas