我正在尝试这样做:
显示“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";
答案 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