PHP ob_start()ob_gzhandler()

Output Control 函数可以你自由控制脚本中数据的它非常地有用特别是当你想在数据已经输出后出文件的情况出控制函数不使用 header() setcookie(),  
送的文件信息生影响,那些类似于 echo() PHP 的数据有作用   

ob_start(); //打开冲区  

echo "Hello\n"; //  
header(“location:index.php”); //浏览器重定向到index.php  
ob_end_flush();//出全部内容到浏览  

 

所有header()函数有了解的人都知道个函数会送一段文件头给浏览但是如果在使用个函数之前已有了任何包括空比如空格就会提示出如果我去掉第一行的ob_start()行此程序发现得到了一条错误提示“Header had  all ready send by”但是加上ob_start就不会提示出原因是当打开了冲区echo后面的字符不会出到浏览而是保留在服直到你使用flush或者ob_end_flush才会所以并不会有任何文件头输出的错误  

  
for($i = 1; $i <= 300; $i++ ) print(“ “);  
// 一句非常关cache使得它的内容只有到一定的大小才能从浏览器里 言之如果cache的内容不到一定的大小它是不会在程序行完出的 过测试发现这个大小的底限是256个字符意味着cache以后接收的内容都会 源源不断的被送出去  
For($j = 1; $j <= 20; $j++) {  
echo $j.””;  
flush(); //一部会使cache新增的内容被出去示到浏览器上  
sleep(1); //程序一秒你把效果看得更清楚  
}  
?>  
如果在程序的首部加入ob_implicit_flush()打开绝对刷新,就可以在程序中不再使用flush(),这样做的好提高效率  

2. 关于ob系列函数  
我想先引用我的好朋友y10k的一个例子  

比如你用得到服器和客端的置信息但是个信息会因端的不同而不同如果想要保存phpinfo()函数的出怎么在没有冲区控制之前可以一点法也没有但是有了
冲区的控制可以松的解决  
-------------------------------------------------------------  
ob_start(); //打开冲区  
phpinfo(); //使用phpinfo函数  
$info=ob_get_contents(); //得到冲区的内容并且$info  
$file=fopen('info.txt','w'); //打开文件info.txt  
fwrite($file,$info); //写入信息到info.txt  
fclose($file); //文件info.txt  
?>  
-------------------------------------------------------------  
用以上的方法就可以把不同用phpinfo信息保存下来在以前恐怕没有
面就是将一些
函数的方法  

可能在大家ob_start()的功能有了一定的了解上面的一个例子看似简单实际上已掌握了使用ob_start()的要点  
<1>.使用ob_start打开browsercache这样可以保cache的内容在你flush(),ob_end_flush()或程序行完之前不会被  
<2>.在的你应该知道你所有的可以在任何出内容后面使用header,setcookie以及sessionob_start一个很大的特点也可以使用ob_start的参数cache被写入后然后自行命令比如ob_start("ob_gzhandler")而我最常用的做法是用ob_get_contents()
cache中的内容然后再……  
<3>.理完可以使用各种方法flush(),ob_end_flush(),以及等到程序行完后的自动输当然如果你用的是ob_get_contents()那么就要你自己控制出方式了  

看看能用ob系列函数做些什么……  

模版技  

模版技就是通某种方式使得用client端得到的是由PHP生的html如果html面不会再被更新那么当另外的用再次浏览程序将不会再PHP以及相关的数据于某些信息量比大的网站例如sina,163,sohu类似种的技术带来的好是非常巨大的  

我所知道的实现态输出的有两种  
<1>.y10k修改的phplib的一个叫template.inc.php实现  
<2>.使用ob系列函数实现  
于第一种方法不是篇文章所要研究的问题所以不再  
们现在来看一看第二种方法的具体实现  
ob_start();//打开冲区  
php面的全部  
$content = ob_get_contents();//取得php出的全部内容  
$fp = fopen(“output00001.html”, “w”); //建一个文件并打开写入  fwrite($fp, $content); //php面的内容全部写入output00001.html然后……  
fclose($fp);  

PHP4.0提供了一个冲函数集合冲支持允你写包裹函数功能压缩缓冲区PHP4冲支持允HTML信息存放, HTML的正文是否但在PHP信息header(), content type, and cookies不采用

在使用PHP程中不免要使用到headersetcookie两个函数两个函数会送一段文件信息给浏览但是如果在使用两个函数之前已有了任何包括空比如空格就会提示出提示信息如下“Header   had   all   ready   send   by”

PHP4.0里面加入了冲区控制的几个函数

函数名称ob_start
函数格式void ob_start(void)
功能打开冲区
冲区激活所有来自PHP程序的非文件信息均不会而是保存在内部冲区冲区的内容可以使用ob_end_flush()或者使用ob_end_clean()冲区的内容

例分析
1冲区控制的函数防止文件头发送信息出

<?   //PHP提示符
ob_start();   //打开冲区
echo   "Welcome   /n";   //
header("location:next.php");   //浏览器重定向到next.php
?>   

如果去掉ob_startPHP就会提示在文件的第4行出信息“Header   had   all   ready   send   by”但是加上ob_start就不会提示出原因是当打开了冲区echo后面的字符不会出到浏览而是保留在服器的冲区中直到你使用flush或者ob_end_flush才会所以并不会出文件出的错误  
PHP4.0.4有一个新的存句柄ob_gzhandler它与前面的类相似但用法不同使用ob_gzhandler要在php.ini中加入的内容如下   
output_handler   =   ob_gzhandler   ;   
行代使得PHP激活压缩送出去的所有内容如果由于某种原因你不想在php.ini中加上行代可以通PHP源文件所在目.htaccess文件改的服器行压缩),法如下   
php_value   output_handler   ob_gzhandler   
或者是从PHP码调如下所示   
ob_start("ob_gzhandler");   

采用存句柄的方法确非常有效而且不会来什么特殊的但必注意的是Netscape   Communicator对压缩图形的支持不佳因此除非你能够保所有用都使用IE浏览应该禁止压缩JPEGGIF一般地于所有其他文件压缩都有效但建针对各种浏览器都分别测试特别是当你使用了特殊的插件或者数据看器时这一点尤其重要   

使用前面介的各种技你能够著地改善网站的性能表应该注意的是   PHP可能是也可能不是性能瓶所在必仔察每一个和用性能有关的因素比如数据   
单纯使用本文技只能在一定限度之内提高Web器的性能因此在咎于PHP以及它的存之前不妨看看是否应该器以及是否可以引入负载平衡技后者需要大的投   
不要低估内容压缩的作用虽然你在100   MB/sLAN接下看到Web用响非常迅速但使用Modem接的用不会只会抱怨你那100   KbHTML

相关函数  
1Flush刷新冲区的内容  
函数格式flush()  
个函数常使用效率很高  
2ob_start 打开冲区  
函数格式void ob_start(void)  
冲区激活所有来自PHP程序的非文件信息均不会而是保存在内部冲区
冲区的内容可以使用ob_end_flush()flush()冲区的内容  
3 ob_get_contents 返回内部冲区的内容  
使用方法string ob_get_contents(void)  
个函数会返回当前冲区中的内容如果冲区没有激活返回 FALSE   
4ob_get_length返回内部冲区的  
使用方法int ob_get_length(void)  
个函数会返回当前冲区中的ob_get_contents如果冲区没有激
返回 FALSE  
5ob_end_flush 送内部冲区的内容到浏览并且关闭输冲区  
使用方法void ob_end_flush(void)  
个函数冲区的内容如果有的  
6ob_end_clean除内部冲区的内容并且关内部冲区  
使用方法void ob_end_clean(void)  
个函数不会出内部冲区的内容而是把它  
7ob_implicit_flush打开或关闭绝对刷新  
使用方法void ob_implicit_flush ([int flag])  
使用Perl的人都知道$│=x的意个字符串可以打开/闭缓冲区ob_implicit_flush函数也和那个一认为闭缓冲区打开绝对输出后每个脚本出都直接送到浏览不再需要 flush()  

深入了解  

1. 关于Flush函数  
个函数在PHP3中就出是一个效率很高的函数他有一个非常有用的功能就是刷新browsercache.们举一个行效果非常明的例子来flush.

posted on 2011-12-14 18:01 -274°C 阅读(1258) 评论(0)  编辑  收藏 所属分类: PHP

只有注册用户登录后才能发表评论。


网站导航:
 

常用链接

留言簿(21)

随笔分类(265)

随笔档案(242)

相册

JAVA网站

关注的Blog

搜索

  •  

积分与排名

  • 积分 - 908979
  • 排名 - 40

最新评论