php缓存控制

今天同事说需要在浏览器及时打印出现在正在执行任务的信息,但又不能一口气的把所有的信息全部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!!

谨此为记。

参考:http://www.iefans.net/ie-php-huanchong-kongzhi/

你可能感兴趣的:(PHP)