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