bifurcan proceso php y atar a usuario web específica
-
08-10-2019 - |
Pregunta
Tengo una aplicación web que tiene unos procesos que pueden tardar hasta 10 minutos para correr. A veces, estos procesos se desencadenan por un usuario y que necesitan la salida, ya que se procesa.
Por ejemplo, el usuario está buscando unos registros que necesitan. los haga clic en el botón para recuperar la registros (esto es la parte que puede tomar 10 minutos). Pueden seguir a trabajar en otras cosas, pero cuando Haga clic de nuevo para ver las vueltas, es actualizan a medida que los registros se descargan en el sistema.
En este momento, el usuario está bloqueado mientras se ejecuta el proceso. Yo sé de pcntl_fork () para desembolsar un proceso hijo para que el usuario no tiene que esperar hasta que se complete el tiempo de proceso.
Me preguntaba si es posible atar ese proceso en forma de horquilla para el usuario específico que haya motivado la solicitud en una variable $_SESSION
para que pueda actualizar el usuario cuando el proceso se haya completado. Además, es ésta la mejor manera de actualizar un usuario en un proceso de larga duración?
Solución
gearman se adapte a sus necesidades. Vistazo a este código de ejemplo, tomado del documento:
<?php
/* create our object */
$gmclient= new GearmanClient();
/* add the default server */
$gmclient->addServer();
/* run reverse client */
$job_handle = $gmclient->doBackground("reverse", "this is a test");
if ($gmclient->returnCode() != GEARMAN_SUCCESS)
{
echo "bad return code\n";
exit;
}
$done = false;
do
{
sleep(3);
$stat = $gmclient->jobStatus($job_handle);
if (!$stat[0]) // the job is known so it is not done
$done = true;
echo "Running: " . ($stat[1] ? "true" : "false") . ", numerator: " . $stat[2] . ", denomintor: " . $stat[3] . "\n";
}
while(!$done);
echo "done!\n";
?>
Si almacena el $job_handle
en la sesión, se puede adaptar la muestra para hacer una secuencia de comandos de control.