PHP输出缓冲区先刷新,然后清理


PHP output buffer flush and then clean

我正在尝试这样做:

显示"a"1秒,只显示"b"1秒,仅显示"c"。

这就是我目前所拥有的,但它不起作用:

header("Content-type: text/html; charset=utf-8");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
set_time_limit(0);
ob_implicit_flush(1);
echo "a";
ob_flush();
ob_clean();
sleep(1);
echo "b";
ob_flush();
ob_clean();
sleep(1);
echo "c";

输出缓冲区不能以这种方式工作,它是单向街道。传递到浏览器的内容是从服务器发送的,您无法再访问这些数据,也无法控制用户已经收到的数据。

唯一的方法是发送控制字符来清除屏幕,但这些字符不属于浏览器可以接受的字符。

理论上,您可以发送'x08(退格),但除了允许使用这些ASCII控制字符之外,它对其他任何事情都不起作用。您使用的是终端还是图形浏览器?第一个可能会接受,而后一个最不可能接受。

没有屏幕。只有从服务器(PHP在服务器上运行)发送到浏览器的输出。

ob函数使用输出缓冲。使用这种技术,您可以在服务器上缓冲输出(回声等的结果),甚至可以在将其发送到客户端(浏览器)之前对其进行降级或修改。

你对这些函数的理解是错误的,你使用它们的方式也是错误的。

充其量,结果可能是"a"出现在第一位,"b"出现在第二位。但也有几个问题。首先,您根本不启动输出缓冲(使用ob_start)。其次,服务器可能已经向浏览器发送了"a",但浏览器也会看到它只有一个字母,并且响应仍在继续,因此很可能不会显示它。半响应通常只是一个不完整的页面,因此浏览器也会缓冲它们得到的响应,以免在屏幕上显示一堆垃圾。在大多数情况下,它们只会在完全收到响应时或在此之前连接断开时显示响应。

总之,这是行不通的。您将需要JavaScript或元重定向来修复此问题。

在启用JavaScript的浏览器中,您可以这样做(不需要PHP):

<body/>
<script type="text/javascript">
// Get the body
var doc = document.getElementsByTagName('body')[0];
// Set its text.
doc.innerText = 'A';
// Replace it with another text after a 1000 milliseconds.
setTimeout(function(){
  doc.innerText = 'B';
}, 1000);
</script>

我不会依赖PHP代码来完成这项工作,希望它的时间安排正确。使用php构建您的页面并检索您需要的任何数据,并使用javascript或jquery来完成您正在尝试的操作。使用javascript/jquery,您可以动态设置页面的html,而无需刷新。看看这里