我使用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脚本和浏览器之间的连接?
答案 0 :(得分:0)
如果未重定向stdio,则该命令不会在后台运行。来自官方文档
注意: 如果使用此函数启动程序,为了使其在后台继续运行,必须将程序的输出重定向到文件或其他输出流。如果不这样做将导致PHP挂起,直到程序执行结束。
在Unix中有几种方法可以改变这种行为,就像您可以在command >/dev/null &
的窗口上使用start command
运行命令一样。