/**
* Author:RDP
* My mail:abel1314520@gmail.com
* My blog: blog.teamhaka.com/
* Author:RDP
* My mail:abel1314520@gmail.com
* My blog: blog.teamhaka.com/
*/
类似于一些开源系统在安装时,会在页面无刷新的输出实时安装状态一样的效果。
实际上是利用不等系统缓存达到一定字节就把已输出的内容交给客户端的原理。(一般为了输出效率,系统会在输出内容积累到一定容量时,再一齐交付给客户端的)
下例在linux服务器和windows服务器上、以及ff5.0和ie8上测试通过无问题
$text = <<< EOM
《送别》
长亭外
古道边
芳草碧连天
晚风拂柳笛声残
夕阳山外山
天之涯
地之角
知交半零落
一壶浊酒尽余欢
今宵别梦寒
EOM;
header( 'Content-Type: text/html;charset=utf-8' );//header必须! 有些浏览器可能会在接收html标记的开头之前缓存内容 比如对FF5.0就是如此
$space = str_repeat(" ",4096);//输出4096个空格
//1 一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。
//2 一些Web服务器的output_buffering默认是4069字符或者更大,即输出内容必须达到4069字符服务器才会flush刷新输出缓冲,为了确保flush有效,最好在ob_flush()函数前有此填充处理
$textArray = explode("\n",$text);
foreach($textArray as $contents){
echo $contents.'';
if(connection_aborted() ){
/* 检查客户端是否已经断开 */
exit;
}
echo $space;//填充
ob_flush();//开启缓存的情况下,脚本输出的内容存入了输出缓存中 ,这时没有处于等待输出状态的内容,你直接使用flush()不会向客户端发出任何内容。而 ob_flush()的作用就是将本来存在于输出缓存中的内容取出来,设置为等待输出状态,但不会直接发送到客户端 ,这时你就需要先使用 ob_flush()再使用flush(),客户端才能立即获得脚本的输出
flush();//刷新PHP程序的缓冲 将当前为止程序的所有输出发送到用户的浏览器
sleep(1);
}
echo 'ok';