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

时间:2014-10-24 20:12:45

标签: php

我正在尝试这样做:

显示“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";

3 个答案:

答案 0 :(得分:2)

输出缓冲区不是这样工作的,它是一条单行道。已经从服务器发送了传递给浏览器的内容,您无法再访问该数据,并且您无法控制用户已收到的数据。

执行此操作的唯一方法是发送控制字符以清除屏幕,但不属于浏览器的字符将接受。

理论上你可以发送\x08(退格),但除了允许使用这些ASCII控制字符的东西之外,它不会起作用。您使用的是终端还是图形浏览器?第一个可能接受,后者最不可能接受。

答案 1 :(得分:2)

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

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

您对这些功能的理解是错误的,就像您使用它们的方式一样。

最好的结果可能是'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>

答案 2 :(得分:0)

我不会依赖PHP代码来实现这一点,并希望它能够正确计时。使用php构建您的页面并检索您需要的任何数据,并使用javascript或jquery来执行您尝试执行的操作。使用javascript / jquery,您可以动态设置页面的html而无需刷新。看看here