今天同事说需要在浏览器及时打印出现在正在执行任务的信息,但又不能一口气的把所有的信息全部echo出来。因为程序需要执行2-3个小时才能结束。
这个功能其实也很好做。使用php自带的ob系列函数就可以了。
我实现的代码如下:
1 //先填充好buffer,防止需要及时输出的东西被放到了buffer中去 start
2 ob_start();
3 $buffer_size = ini_get('output_buffering');//获得缓冲区大小
4
5 for($i=0;$i<(int)$buffer_size;$i++){
6 echo ' ';
7 }
8 ob_flush();
9 flush();
10 //先填充好buffer,防止需要及时输出的东西被放到了buffer中去 end
11
12 //下面为需要及时输出的内容
13 for($i=1;$i<=10;$i++){
14 echo $i,'<Br />';
15 ob_flush();
16 flush();
17 sleep(1);
18 }
每秒打印1个字符。共打印十个数字。
这个效果在ff、ie8下都很好。但是在ie6下,第一次执行的时候确实等了10多秒一下在打印出来的。再次刷次页面的时候才和ff、ie8的效果一直。
我想这个情况是因为ie6浏览器自带缓冲区导致的问题。可是又不知道怎么解决。于是在www上搜索了一下。原来真的是这样的。网上有位哥们说
“IE的某些版本只有在字符串缓冲到256字节的时候才会将缓冲内容输出到浏览器上”。
于是我修改了上面的代码为:
1 //先填充好buffer,防止需要及时输出的东西被放到了buffer中去 start
2 ob_start();
3
4 function isIE6(){
5 $agent = $_SERVER['HTTP_USER_AGENT'];
6 return (stripos($agent, 'MSIE 6.0') !== false);
7 }
8
9 $buffer_size = ini_get('output_buffering');//获得缓冲区大小
10
11 //如果是IE6 需要加上256,因为在某些ie6版本下 ie6浏览器自己有256的缓冲区
12 if (isIE6()) {
13 $buffer_size = (int)$buffer_size + 256;
14 }
15
16 for($i=0;$i<(int)$buffer_size;$i++){
17 echo ' ';
18 }
19 ob_flush();
20 flush();
21 //先填充好buffer,防止需要及时输出的东西被放到了buffer中去 end
22
23 //下面为需要及时输出的内容
24 for($i=0;$i<10;$i++){
25 echo $i,'<Br />';
26 ob_flush();
27 flush();
28 sleep(1);
29 }
执行下。ok!!
谨此为记。