在使用exec()结束后台程序运行后,AJAX脚本才会响应

时间:2016-05-01 15:42:30

标签: php ajax exec background-process

我使用exec()运行后台PHP程序,如下所示:

exec('/usr/bin/php bgScript.php "arg1" "arg2" > /dev/null 2>&1 &');

它可以工作,程序确实在后台运行。

问题

我已启用输出缓冲,并希望保持这种状态。

我的整个脚本是这样的:

exec('/usr/bin/php bgScript.php "arg1" "arg2" > /dev/null 2>&1 &');
echo json_encode(array(
  "status" => "started"
));

当对上面的文件发出 AJAX 请求时,该过程将启动并处于后台。我假设这是因为,对服务器的进一步请求返回数据,而不是wait以完成之前的AJAX脚本。

但问题是,在后台进程完成后才会输出 JSON数据

由于程序是在后台运行的,不应该在不等待exec()结束的情况下输出JSON数据?我不知道怎么说技术(原谅我):为什么输出缓冲区一直持续到exec()结束?

如何在后台启动程序后立即输出JSON数据并关闭AJAX脚本和浏览器之间的连接?

1 个答案:

答案 0 :(得分:0)

如果未重定向stdio,则该命令不会在后台运行。来自官方文档

  

注意:   如果使用此函数启动程序,为了使其在后台继续运行,必须将程序的输出重定向到文件或其他输出流。如果不这样做将导致PHP挂起,直到程序执行结束。

在Unix中有几种方法可以改变这种行为,就像您可以在command >/dev/null &的窗口上使用start command运行命令一样。