【问题标题】:proc_open() run a process make PHP wait it to finish?proc_open() 运行一个进程让 PHP 等待它完成?
【发布时间】:2012-02-11 08:07:52
【问题描述】:

我在 windows7 上使用 XAMPP 1.7.7。(PHP 版本 5.3.8) 我使用 proc_open() 运行一个进程并希望重定向到另一个网页, 但 PHP 会等到该过程完成。 我不希望正在运行的进程让我的网络等待它。 我该怎么办?

我需要管道和返回值。

我需要什么: 用户在页面 A 中提交内容,然后网络将重定向到页面 B(并且用户可以离开页面 B)。 同时会调用一些进程,产生一些结果并更新 数据库,因此当用户刷新页面 B 时,将显示正确的结果。 更重要的是,用户可以随时查看页面B。 我注意到克里斯对PHP Manual 的评论,他的方法可以运行一个进程 独立于 PHP。但我不知道如何在隐藏过程中使用管道或获取 返回值。

我对AJAX一无所知,我认为Gearman可能会工作,但它可能有点复杂。

【问题讨论】:

    标签: php process


    【解决方案1】:

    这应该使用像Gearman 这样的作业队列来完成,这样您就可以让工作人员继续运行,然后稍后从您重定向到的页面询问其状态。

    要在 Windows 上安装 Gearman,请查看之前的 SO 问题和答案:How to configure or install GEARMAN in windows OS?

    【讨论】:

      【解决方案2】:

      PHP 在设计上是单线程的。 HTTP 请求完成后,无法让 php 进程继续运行。

      话虽如此,您可以利用 AJAX 来做您想做的事。同时触发两个请求,而不是一个 HTTP 请求。其中之一将包含漫长的过程(以及set_time_limit(0))。

      有很多不同的方法可以做到这一点。我通常做的是:当我收到初始请求时,我立即响应一个 HTML 页面,其中包含对包含长进程的第二个 php 文件的自动 AJAX 调用。所以每个人都很高兴:用户看到了即时响应,而漫长的过程可能需要一些时间,因为没有人在等待。

      【讨论】:

      • 谢谢。但我现在不知道。
      【解决方案3】:

      【讨论】:

      • 对不起,这对我不起作用。因为我运行的是 Windows 操作系统,我需要管道将数据传输到进程的 STDIN 并获取它的 STDOUT、STDERR 并获取它的返回值。
      【解决方案4】:

      我已经通过启动一个新的 PHP 来实现我的请求来解决这个问题。 http://www.php.net/manual/en/function.proc-open.php#90584

      【讨论】:

      • 此链接不再可用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-21
      • 1970-01-01
      • 2016-09-09
      • 1970-01-01
      • 1970-01-01
      • 2012-08-26
      • 2021-07-26
      相关资源
      最近更新 更多