我有一个网络应用程序,该应用程序具有一些过程,最多可能需要10分钟才能运行。有时,这些过程是由用户触发的,并且需要在处理过程中进行输出。

例如,用户正在寻找所需的一些记录。单击按钮检索记录(这是可能需要10分钟的部分)。他们可以继续处理其他事情,但是当他们单击以查看退货时,随着记录下载到系统中时会进行更新。

目前,该过程运行时用户已锁定。我知道pcntl_fork()要分叉一个子进程,以便用户不必等到漫长的过程完成。

我想知道是否有可能将这些过程分叉为触发请求的特定用户 $_SESSION 可变,以便我可以在过程完成后更新用户。另外,这是在长期运行过程中更新用户的最佳方法吗?

有帮助吗?

解决方案

我认为 装备 适合您的需求。查看此示例代码,从文档中获取:

<?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";

?>

如果您存储 $job_handle 在会话中,您可以调整样本以制作控制脚本。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top