php Output Control 函数 ob_系列函数详解

<?php
/*
 * 输出缓冲控制
 * 
 * 
flush — 刷新输出缓冲
ob_clean — 清空(擦掉)输出缓冲区
ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲
ob_end_flush — 冲刷出(送出)输出缓冲区内容并关闭缓冲
ob_flush — 冲刷出(送出)输出缓冲区中的内容
ob_get_clean — 得到当前缓冲区的内容并删除当前输出缓。
ob_get_contents — 返回输出缓冲区的内容
ob_get_flush — 刷出(送出)缓冲区内容,以字符串形式返回内容,并关闭输出缓冲区。
ob_get_length — 返回输出缓冲区内容的长度
ob_get_level — 返回输出缓冲机制的嵌套级别
ob_get_status — 得到所有输出缓冲区的状态
ob_gzhandler — 在ob_start中使用的用来压缩输出缓冲区中内容的回调函数。ob_start callback function to gzip output buffer
ob_implicit_flush — 打开/关闭绝对刷送
ob_list_handlers — 列出所有使用中的输出处理程序。
ob_start — 打开输出控制缓冲
output_add_rewrite_var — 添加URL重写器的值(Add URL rewriter values)
output_reset_rewrite_vars — 重设URL重写器的值(Reset URL rewriter values)
 * 
 * 
 * 
 */

/*
 * 
前言,好多人说ob系列函数是来做缓存用的其实并不是,相反如果在执行代码的时候反而会增加一层代码缓存执行
在php.ini里面默认是不打开output_buffering这个选项,因为会损失php性能
打开了php输出缓存: echo,print -> php output_buffring -> server buffering ->browser buffering -> browser display
未打开php输出缓存: echo,print -> server buffering -> browser buffering ->browser display

ob_start()会自动开启此功能,chunk_size 也就是输出缓冲区大小默认是4096也就是4KB
bool ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] )
 * chunk_size默认值 0 意味着函数仅在最后被调用
也是可以自己设置php缓冲区大小的,也是可以调用回调函数,个人觉得这个才是最大的用处

浏览器的输出缓存:IE为256Bytes, Chrome与FireFox为1000Bytes,也就是说ie有256KB缓存之后才会显示,同理,但是现在实际大小是多少,没有测试

但是对于实现页面静态化的确是很不错的工具,下面会有一个简单的demo



 * 
 * 
 */



 
//ob_implicit_flush(true);  
////echo str_pad(" ", 256);//填充到256KB
////ob_start();
//for ($i=10; $i>0; $i--) {  
//   echo $i;  
//   ob_flush();  
//   sleep(1);   
//} 
//这样你就会看到倒数到5的时候才会打印剩余的数字,不然一直会出现缓冲,不会打印出任何东西,测试时在chrome下测试,ie效果不明显
//当你开启ob_start()的时候,默认缓冲区是4KB,我们打印的数据不足4k,所以会缓冲然后在一次性显示出现
//不手动开启,你就会发现,当缓冲区数据满了之后才会不间断输出





//flush(),ob_flush(),ob_end_flush()
//flush只是冲刷出缓冲区数据。ob_flush()也可以冲刷出缓冲区数据,但是会吧缓冲区数据丢弃,可以再次把数据放入缓冲器的数据再次冲刷出来,多次利用
//ob_end_flush()是冲刷出来之后就会销毁缓冲区

//ob_implicit_flush() 将打开或关闭绝对(隐式)刷送。绝对(隐式)刷送将导致在每次输出调用后有一次刷送操作,以便不再需要对 flush() 的显式调用

//ob_start();
//echo "sssssssssssssssss";
//echo ‘<br>‘;
//echo ‘<br>‘;
//echo $e = ob_get_contents();//获得缓冲区内容
//echo $len1 = ob_get_length();//50,获取缓冲区长度
//echo ‘<br>‘;
//echo ob_get_level();//返回嵌套的输出缓冲处理程序的级别;或者是,如果输出缓冲区不起作用,返回零
//echo ‘<br>‘;
//print_r(ob_list_handlers());
//ob_flush();



//ob_start();
//echo ‘zzzzzzzzzzzzzzzzzzz‘;
//echo ‘<br>‘;
//echo ‘<br>‘;
//echo $e = ob_get_contents();

//echo ob_get_flush();//刷出(送出)缓冲区内容,以字符串形式返回内容,并关闭输出缓冲区

//ob_clean();//清除缓冲区内容,打印不出来

//$g =ob_get_status();
//var_dump($g);
//ob_end_clean();




//output_add_rewrite_var — 添加URL重写器的值(Add URL rewriter values)
//此函数给URL重写机制添加名/值对。 这种名值对将被添加到URL(以GET参数的形式)和表单(以input隐藏域的形式),
//当透明URL重写用 session.use_trans_sid 开启时同样可以添加到session ID。 要注意,绝对URL(http://example.com/..)不能被重写。 
//此函数的行为由url_rewriter.tags php.ini 参数控制。 
//如果还没有活跃的输出缓冲区,调用此函数将隐式地开启它

//output_add_rewrite_var ( ‘var‘ ,  ‘value‘ );
//// some links
//echo  ‘<a href="file.php">link</a>
//<a href="http://www.baidu.com">link2</a>‘ ;
//// a form
//echo  ‘<form action="script.php" method="post">
//<input type="text" name="var2" />
//</form>‘ ;
//
//print_r(ob_list_handlers());

//点击link时候,连接就成了 file.php?var=value    form提交到script.php的时候在连接会额外加上script.php?var=value
//和hidden域的使用方式类似

function  callback ( $info )
{
   return ( str_replace ( "zx" ,  "bb" ,  $info ));
   //注意,如果需要全部静态页面类似dedecms这个思路,如果全部生成了静态页面之后,吧所有的页面执行一次就可以吧静态页面生成
   //在你设计生成目录和文件名称规则的时候,要和你在这里替换网页里面的动态url成为静态的url风格一致,不然替换的正则表达式会很复杂
}
//ob_flush();
ob_start("callback");
?>

<html>
    <head>
        <title>页面静态化思路实现 </title>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8">
    </head>
<body>
<p>It‘s like comparing zx to oranges.</p>
</body>
</html>


<?php
$info = ob_get_contents();//获得缓冲区内容
//例如这个是产品页面,产品id是15,分类是product ,添加日期实践戳date格式化2015
//是正常的程序分类,产品ID,添加日期,都是变量可以在数据库查询出来

$dir = "./product/".date("Y-m-d",time());
if(!is_dir($dir)){
    
    mkdir($dir,0777,true);//true递归创建文件夹,创建的时候是ANSI编码,只要在html页面给编码格式就不会乱码
}
if(!file_exists($dir."/15.html")){
    
   $file=fopen($dir."/15.html",‘w‘);
   fwrite($file,$info); //写入信息到info.txt
   fclose($file); 
    
}  else {
    echo ‘already exits‘;
}
//ob_end_clean();
ob_flush();
?>

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。