b开发中有没有碰到须要适时的将结果输出到浏览器页面而不刷新整个页面的需求呢?当你在处理一个过程须要耗时很长,但你又须要适时的知道程序当前的处理情况的时候,该怎么办呢?下面就分享一下如何使用php及时的输出当前结果到浏览器而不刷新整个页面的效果吧。 php
下面以一个简单的例子来讲明这个问题。首先来看一段代码:浏览器
for($i=0;$i<10;$i++){ echo $i; sleep(1); }
上面这段程序若是在PHP解释器中执行,每秒会输出一个数,和预计效果同样。但在浏览器中访问时,结果倒是浏览器在十秒以后一次性地显示了全部结果。对于这个问题,咱们可使用 ob_flush() 和 flush() 来强制刷新浏览器缓存,程序改成:缓存
for($i=0;$i<10;$i++){ echo $i; ob_flush(); flush(); sleep(1); }
问题解决,但又出来个问题,浏览器还不兼容了。实际测试中只有 Firefox 按预计效果即时输出告终果,而在 IE Safari Opera 等浏览器中仍是一次性的输出结果。查阅相关资料发现是由于不一样的浏览器对缓冲的处理方式不一样,Firefox 在被要求强制刷新缓存时很听话,而IE须要在接收到256个字节后才会将内容即时展示在界面上,Safari 须要1024个字节,Opera 更有个性,只有在遇到HTML标签的时候才会即时输出(Safari也是如此)。 测试
对于以上问题,针对IE和Safari,能够在输出结果以前先输出大于限定数目的空白字符: firefox
echo str_repeat(" ",1024); for($i=0;$i<10;$i++){ echo $i; ob_flush(); flush(); sleep(1); }
而对于Opera、Safari遇到HTML标签后才会即时输出的问题,因为通常咱们不会只往浏览器中输出纯文本内容,故能够不做考虑。对于上面的程序,能够在输出结果中加入HTML标签来达到目的: ip
echo str_repeat(" ",1024); for($i=0;$i<10;$i++){ echo $i."<br>"; ob_flush(); flush(); sleep(1); }
至此已基本实现了在各个浏览器中达到一致的效果了,至于实际工做中,你多是另一种目的可是须要相似这种效果,则只须要根据须要作相应的修改便可。 开发
echo '<script>document.body.innerHTML="";</script>'; //输出以前清空以前输出的内容
echo '<script>window.scrollTo(0,document.body.scrollHeight);</script>';//输出后滚动条自动到最底部 get