php - 在php中长时间运行的进程中,ajax创建后台进程

  显示原文与译文双语对照的内容
129 4

如果这是另一个问题的重复,但是在搜索之后我没有找到一个明确的答案。我想要做的是让我的php web应用程序消除一些事件( 。如电子邮件或者报告生成器),这可以能需要几分钟的时间才能完成控制。我来自一个. NET 世界,它很容易用线程来完成。

下面是工作流:

  • 用户单击'生成报告'按钮
  • 对'../blah/generate-report'的ajax调用并立即返回
  • 进程启动并运行直到完成,用户才能继续自己的业务
  • 用户可以返回到报告页并查看进度:"报告 50%完成"

什么是最好的解决方法?简短答案是正确的。我不想为我编写代码,只是一些指导。我看了shell_exec但是我不确定是否是最好的方法,如果是,如何使用它处理web应用程序中的函数。( 如果有任何差异的话,我将使用Yii框架) 。谢谢。

-Jason

时间:原作者:0个回答

68 5

在PHP中启动新线程线程类似的最好的方法是使用curl创建一个新的PHP请求。

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.yoursite.com/background-script.php');
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
curl_setopt($ch, CURLOPT_TIMEOUT_MS, 1);
curl_exec($ch);
curl_close($ch);

这将运行脚本,并立即返回页面。当然,没有回调,所以最好的选择是将 background-script.php 输出放到数据库中,然后在查看结果之前。

原作者:
120 2

我记住,shell_exec或者exec将阻止你的PHP脚本执行直到进程终止。解决方案是在命令的末尾追加一个"&",你的脚本/程序将是 backgrounded 。

"/usr/report.sh &"

我使用类似于PHP的外部工具运行外部工具,但是通过一个中介脚本来控制 PID 。实例数。无法说它是否在 Windows 主机下工作。

原作者:
69 0

我们在这里创建了一个函数,它返回对浏览器的答案并继续执行。我们用它来发送电子邮件,而不用让用户等待它。

public function redirectAndContinue( $url )
{
 ignore_user_abort(true);
 header("Location: $url");
 header("Connection: close");
 header("Content-Length: 0");
 flush();
}

你可以用这个

//do quick basic stuff to validate your report
$this->redirectAndContinue( $url )
//send your email or do other slow stuff

问题是:它不能使用 AJAX,它必须是常规页面请求( 可能有一个帖子) 。但是,你仍然可以制作进度条:在数据库或者会话中保存一些东西,然后继续调用一些URL以通过AJAX获得进展。

原作者:
...