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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top