ob的基本原则:如果ob缓存打开,则echo的数据首先放在ob缓存。如果是header信息,直接放在程序缓存。当页面履行到最后,会把ob缓存的数据放到程序缓存,然后依次返回给涉猎器。
下面我说说ob的基本作用:
  1)防止在涉猎器有输出之后再应用setcookie()、header()或session_start()等发送头文件的函数造成的差错。其实这样的用法少用为好,养成良好的代码习性。
  2)捕捉对一些不可获取的函数输出,比如phpinfo()会输出一大堆的HTML,但是我们无法用一个变量例如$info=phpinfo();来捕捉,这时候ob就管用了。
  3)对输出的内容进行处理,例如进行gzip收缩,例如进行简繁转换,例如进行一些字符串调换。
  4)生成静态文件,其实就是捕捉整页的输出,然后存成文件。经常在生成HTML,或者整页缓存中应用

对于刚才说的第三点中的GZIP收缩,可能是很多人想用,却没有真用上的,其实稍稍改动下代码,就可以实现页面的gzip收缩。

. 代码如下:

ob_start(ob_gzhandler);
要缓存的内容

没错,加一个ob_gzhandler这个回调函数就可以了,不过这么做有些小问题,一是需要zlib支持,二是没有判断涉猎器是否支持gzip(现在好像都支持,iphone涉猎器好像都支持了)。
以前的做法是判断一下涉猎器是否支持gzip,然后用第三方的gzip函数来收缩ob_get_contents() 的内容,最后echo。

一、ob系列函数中常用函数集锦

. 代码如下:

ob_start();            //打开一个输出缓冲区,所有的输出信息不再直接发送到涉猎器,而是保存在输出缓冲区里面。

ob_clean();            //删除内部缓冲区的内容,不关闭缓冲区(不输出)。
ob_end_clean();        //删除内部缓冲区的内容,关闭缓冲区(不输出)。
ob_get_clean();        //返回内部缓冲区的内容,关闭缓冲区。相当于履行 ob_get_contents() and ob_end_clean()
ob_flush();            //发送内部缓冲区的内容到涉猎器,删除缓冲区的内容,不关闭缓冲区。
ob_end_flush();        //发送内部缓冲区的内容到涉猎器,删除缓冲区的内容,关闭缓冲区。
ob_get_flush();        //返回内部缓冲区的内容,并关闭缓冲区,再释放缓冲区的内容。相当于ob_end_flush()并返回缓冲区内容。
flush();               //将ob_flush释放出来的内容,以及不在PHP缓冲区中的内容,整个输出至涉猎器;刷新内部缓冲区的内容,并输出。

ob_get_contents();     //返回缓冲区的内容,不输出。
ob_get_length();       //返回内部缓冲区的长度,如果缓冲区未被激活,该函数返回FALSE。
ob_get_level();        //Return the nesting level of the output buffering mechanism.
ob_get_status();       //Get status of output buffers.

ob_implicit_flush();   //打开或关闭绝对刷新,默觉得关闭,打开后ob_implicit_flush(true),所谓绝对刷新,即当有输出语句(e.g: echo)被履行时,便把输出直接发送到涉猎器,而不再需要调用flush()或等到脚本收场时才输出。

ob_gzhandler               //ob_start回调函数,用gzip收缩缓冲区的内容。
ob_list_handlers           //List all output handlers in use
output_add_rewrite_var     //Add URL rewriter values
output_reset_rewrite_vars  //Reset URL rewriter values

这些函数的行为受php_ini设置的影响:
output_buffering       //该值为ON时,将在所有脚本中应用输出把持;若该值为一个数字,则代表缓冲区的最大字节限制,当缓存内容达到该上限时将会自动向涉猎器输出当前的缓冲区里的内容。
output_handler         //该选项可将脚本所有的输出,重定向到一个函数。例如,将 output_handler 设置为 mb_output_handler() 时,字符的编码将被改动为指定的编码。设置的任何处理函数,将自动的处理输出缓冲。
implicit_flush         //作用同ob_implicit_flush,默觉得Off。

二、实例解说

1、使 header() 函数前可以有echo代码
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才会输出,所以并不会有任何文件头输出的差错!
2、保存 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

3、静态模版技巧
所谓静态模版技巧就是通过某种方式,使得用户在client端得到的是由PHP产生的html页面。如果这个html页面不会再被更新,那么当另外的用户再次涉猎此页面时,程序将不会再调用PHP以及相关的数据库,对于某些信息量对比大的网站,例如sina、163、sohu。类似这种的技巧带来的好处是非常巨大的。

. 代码如下:

ob_start();                            //打开缓冲区
php页面的整个输出   
$content = ob_get_contents();          //取得php页面输出的整个内容   
$fp = fopen("output00001.html", "w");  //创建一个文件,并打开,准备写入   
fwrite($fp, $content);                 //把php页面的内容整个写入output00001.html,然后……   
fclose($fp);

三、输出缓存句柄ob_gzhandler
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涉猎器,否则你应该阻挠收缩JPEG和GIF图形。一般地,对于所有其他文件,这种收缩都有效,但建议你针对各种涉猎器都分辨进行测试,特别是当你应用了特殊的插件或者数据查看器时这一点尤其首要。
注意事项:
1、一些Web服务器的output_buffering默认是4069字符或者更大,即输出内容必须达到4069字符服务器才会flush刷新输出缓冲,为了确保flush有效,最好在ob_flush()函数前有以下语句:

. 代码如下:

print str_repeat("", 4096);  //以确保到达output_buffering值

2、ob_* 系列函数是操作PHP本身的输出缓冲区,所以ob_flush只刷新PHP自身的缓冲区,而flush是刷新apache的缓冲区。所以,正确应用俩者的顺序是:先ob_flush,然后flush。ob_flush是把数据从PHP的缓冲中释放出来,flush是把缓冲内/外的数据整个发送到涉猎器。
3、不要误觉得用了ob_start()后,脚本的echo/print等输出就永远不会显示在涉猎器上了。因为PHP脚本运行收场后,会自动刷新缓冲区并输出内容。

ob 函数讲解的更多相关文章

  1. avascript中的this与函数讲解

    徐某某 一个半路出家的野生程序员 javascript中的this与函数讲解 前言 javascript中没有块级作用域(es6以前),javascript中作用域分为函数作用域和全局作用域.并且,大 ...

  2. 结合php ob函数理解缓冲机制

    对于一个刚刚入门的php程序员来说,php缓冲区是几乎透明的.在他们心目中,一个echo print_r 函数,数据便会‘嗖’的一声飞到浏览器上,显示出来.我也一直如此单纯地认为. 其实,在技术的世界 ...

  3. Python中高阶函数讲解

    高阶函数讲解 1. 常规高阶函数 递归函数 格式:def func_name(variable): '''__doc__'''#函数的说明文档 if 条件表达式:#限制递归退出值 pass retur ...

  4. python ---split()函数讲解

    python ---split()函数讲解 split中文翻译为分裂. 在python用于分割字符串使用. split()就是将一个字符串分裂成多个字符串组成的列表. split()可以传入参数,也可 ...

  5. ob 函数的使用

    ob 函数的使用1. 页面静态化 $id = isset($_GET['id'])?$_GET['id']-0:0; $filename = "html/".date(" ...

  6. MySql UNIX_TIMESTAMP和FROM_UNIXTIME函数讲解

    MySql UNIX_TIMESTAMP和FROM_UNIXTIME函数讲解 by:授客 QQ:1033553122 1. unix_timestamp(date)将时间转换为时间戳,如果参数为空,则 ...

  7. Spark Streaming中的操作函数讲解

    Spark Streaming中的操作函数讲解 根据根据Spark官方文档中的描述,在Spark Streaming应用中,一个DStream对象可以调用多种操作,主要分为以下几类 Transform ...

  8. linux xfs文件系统无法用readdir获取dirent文件类型d_type则用stat获取暨stat函数讲解

    stat函数讲解 表头文件:    #include <sys/stat.h>             #include <unistd.h>定义函数:    int stat ...

  9. linux stat函数讲解 -(转自秋水Leo)

    stat函数讲解表头文件:    #include <sys/stat.h>             #include <unistd.h>定义函数:    int stat( ...

随机推荐

  1. git学习——查看提交历史

    git log可以查看提交历史: 用-p选项展开显示每次提交的内容差异,用-2则仅显示最近两次的更新:git log -p -2 在-p选项后面使用--word-diff选项进行单词层面的对比.这其中 ...

  2. 通过Fsharp探索Enterprise Library Exception

    Exception怎么生成是一回事,怎么展示又是还有一回事了. Exception Block主要关注的点在于Exception信息的展示.Exception不同于一般的log信息,是系统设计者未考虑 ...

  3. Angular 学习笔记——模块之间的通讯

    <!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="C ...

  4. Effective C++ 条款17

    以独立语句将newed对象置入智能指针 本节我们须要学习的知识核心是注意编译器在同一语句中,调用次序具有不确定性,不同语句中,调用次序确定. 上面的话什么意思? 请看下面代码: int priorit ...

  5. Jmeter启动报注册表警告

    启动Jmeter后,控制台出现如下的警告: 主要出现的原因是: java.util.prefs.WindowsPreferences需要保存信息到HKEY_LOCAL_MACHINE\Software ...

  6. Nginx:访问第三方服务

    参考资料<深入理解Nginx> Nginx可以当做一个强大的反向代理服务器,其反向代理模块是基于upstream方式实现的. upstream的使用方式 HTTP模块在处理任何一个请求时都 ...

  7. 【Excle数据透视表】如何按照地区交替填充背景颜色

    现存在如下数据透视表 需要根据地区填充不同的背景颜色 步骤 选定数值区域→开始→条件格式→新建规则,出现如下窗口: 公式:=MOD(COUNT(1/(MATCH($A$4:$A4,$A$4:$A4,) ...

  8. Database returned an invalid value in QuerySet.datetimes(). Are time zone definitions for your datab

    Database returned an invalid value in QuerySet.datetimes(). Are time zone definitions for your datab ...

  9. Mysql 创建权限较小的用户(只对特定数据库有操作权限)

    项目开发过程中,因为root的权限太大,可能对其他数据库造成修改.故创建一权限较小的用户,使其只能对特定的数据库操作,以保证数据安全. 主要语句如下: grant all on bos19.* to ...

  10. MQTT--topic

    1.topic  定阅与发布必须要有主题,只有当定阅了某个主题后,才能收到相应主题的payload,才能进行通信. 2. 主题层级分隔符—“/”  主题层级分隔符使得主题名结构化.如果存在分隔符,它将 ...