2012-04-26 9 views
9

Estoy en un punto en mi API de PHP del lado del servidor donde estoy haciendo un montón de consultas MySQL y me gustaría acelerarlo teniendo varios subprocesos trabajando en diferentes consultas y luego devolver los resultados.concurrencia en PHP

Pero, ¿cómo puedo hacer otro hilo en PHP? Estoy pasando por los parámetros POST, por lo que un simple shell_exec() podría funcionar, pero parece un poco inseguro. Estoy considerando opciones:

1) hacer una solicitud cURL utilizando los parámetros que tengo, el proceso de JSON de la solicitud y luego regresar

2) llamar a un shell_exec() con PHP CLI y de alguna manera (¿cómo iba a hacer esto ??) procesar la respuesta en PHP

¿cuáles son las mejores opciones aquí?

+0

Por lo general, se hace con la cola y el trabajador, que lo controla – zerkms

+0

¿cómo se hace esto? – lollercoaster

+0

configura un software de administración de colas (es decir, rabbitmq). A continuación, su secuencia de comandos agrega tareas a la cola y algunos trabajadores de base lo realizan – zerkms

Respuesta

4

No hay soporte para subprocesos en PHP. Sin embargo, puede usar la extensión pcntl para generar y gestionar las horquillas, pero sería mejor echar un vistazo a sus algoritmos si llega a la conclusión de que las cosas deben hacerse con el enhebrado.

Una opción para procesar operaciones de larga ejecución de forma asincrónica sería almacenarlas en una base de datos y hacer que un proceso en segundo plano las tome de la base de datos, calcular los resultados y almacenar los resultados en la base de datos. Luego, el script que se encuentra frente a frente los buscará en la base de datos para ver si están completos y cuál es el resultado.

+1

¿Cómo se crean los sitios web a gran escala en PHP si ese es el caso? – lollercoaster

+1

@lollercoaster: ¿cómo se relaciona "a gran escala" con los hilos? – zerkms

+1

me parece que las API/sitios críticos para el rendimiento con muchas interacciones con la base de datos necesitarían concurrencia – lollercoaster

3

Echa un vistazo a pcntl extension. PHP no es compatible con el enhebrado verdadero en absoluto, por lo que tendrá que implementar pseudo-hilos mediante fork() ing. Tenga en cuenta que la horquilla() de un proceso es mucho más "pesada" que generar un hilo.

2

PHP no ha implementado hilos (y probablemente nunca lo hará) porque muchas de las bibliotecas de PHP NO son seguras para hilos. Esa alterativa es pcntl que envuelve la función C fork.

Tengo created a handy wrapper para estas funciones que me permiten administrarlas a un nivel superior.

$thread1 = new Thread(function($thread) { 
    sleep(4); 
    $thread->write("Hello\n"); 
}); 

$thread2 = new Thread(function($thread) { 
    sleep(5); 
    $thread->write("World\n"); 
}); 

$thread3 = new Thread(function($thread) { 
    sleep(6); 
}); 

print $thread1->read(); // time: 0 -> 4 
print $thread2->read(); // time: 4 -> 5 
$thread3->join(); // time 5 -> 6 

// More advanced handling: 
// Thread::selectUntilJoin(array($thread1, $thread2, $thread3), function() { ... }, function() { ... }); 
+0

"lo que significa que no se pueden llamar las funciones desde diferentes subprocesos" --- no es la definición correcta para el código TS – zerkms