php shell脚本不等待完成进程

时间:2017-06-03 15:51:12

标签: php asynchronous

我通过命令行在php中运行类似的内容:

echo "first sentence";
sleep(5);
echo "second sentence";

按cmd运行时,打印第一句,5秒后打印第二句。但是当我遇到网络浏览器时,它等待完成这个过程。为什么会发生这种情况?有什么想法吗?

2 个答案:

答案 0 :(得分:0)

  

cmd运行时,打印第一句,5秒后打印第二句。但是当我遇到网络浏览器时,它等待完成这个过程。为什么会在cmd?

中发生这种情况

使用CLI运行脚本时会发生这种情况,因为这是您要求它执行的操作。 当Web服务器调用它时,它的工作原理相同。

不同之处在于,当您在终端中运行它时,没有中间过程。 PHP解释器产生一些输出,终端显示它。

出于优化目的,只要PHP脚本生成数据,Web服务器就不会将数据发送回浏览器(可能是地球的一半)。它将它放入缓冲区并在PHP脚本结束或缓冲区已满时将其发送到浏览器。

PHP解释器本身使用这样的缓冲区来输出。

您可以通过调用flush()强制PHP发送生成的输出(例如,在每个echo之后)。 然而,这并没有解决任何问题。

PHP解释器将输出发送到Web服务器,但Web服务器有自己的缓冲机制,无法通过PHP脚本进行控制。 更多,即使Web服务器将输出发送回浏览器,浏览器也会决定是否使用数据来更新已经呈现的页面,或者等到更多数据到来(或连接关闭)。

更重要的是,如果浏览器和服务器之间存在代理,它们通常会实现自己的缓冲机制,无法以任何方式说服它们刷新缓冲区。

答案 1 :(得分:-1)

最后我找到了答案。它有利于调试目的:

@ini_set('zlib.output_compression', 1);
@ini_set('implicit_flush', 1);
@ob_end_clean();
set_time_limit(0);
ob_implicit_flush(1);
ob_end_flush();

echo "first sentence";
sleep(5);
echo "second sentence";

ob_start();