bifurquer processus de php et attacher à l'utilisateur Web spécifique
-
08-10-2019 - |
Question
J'ai une application web qui a quelques processus qui peut prendre jusqu'à 10 minutes pour courir. Parfois, ces processus sont déclenchés par un utilisateur et ils ont besoin de la sortie comme elle est traitée.
Par exemple, l'utilisateur recherche quelques dossiers dont ils ont besoin. le cliquez sur le bouton pour récupérer la dossiers (ce qui est la partie qui peut prendre 10 minutes). Ils peuvent continuer à travailler sur d'autres choses, mais quand ils cliquez sur Retour pour afficher les retours, il est mis à jour les enregistrements sont téléchargés dans le système.
En ce moment, l'utilisateur est verrouillé alors que le processus fonctionne. Je sais pcntl_fork () à la fourche un processus enfant afin que l'utilisateur n'a pas à attendre que le finalise long processus.
Je me demandais s'il est possible de lier ce processus fourchue à l'utilisateur spécifique qui a déclenché la demande dans une variable $_SESSION
afin que je puisse mettre à jour l'utilisateur lorsque le processus est terminé. Aussi, est-ce la meilleure façon de mettre à jour un utilisateur sur un processus de longue durée?
La solution
Je pense que gearman à vos besoins. Regardez ce code échantillon prélevé dans le doc:
<?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 vous stockez la $job_handle
dans la session, vous pouvez adapter l'échantillon pour faire un script de contrôle.