PHP输出缓存ob系列函数详解

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脚本运行结束后,会自动刷新缓冲区并输出内容。

(0)

相关推荐

  • 基于PHP输出缓存(output_buffering)的深入理解

    首先明确一下PHP的输出顺序1.打开了php输出缓存: echo,print -> php output_buffring -> server buffering -> browser buffering -> browser display2.未打开php输出缓存: echo,print -> server buffering -> browser buffering -> browser display 另外明确一下浏览器的输出缓存:IE为256Bytes,

  • PHP使用缓存即时输出内容(output buffering)的方法

    PHP使用缓存即时输出内容(output buffering)的方法.分享给大家供大家参考.具体如下: $buffer = ini_get('output_buffering'); echo str_repeat(' ',$buffer+1); //防止浏览器缓存 ob_end_flush(); //关闭缓存 for( $i=1; $i<=10; $i++ ){ echo '第 '.$i.' 次输出.'."<br />\n"; flush(); //刷新缓存(直接发送

  • PHP使用header()输出图片缓存实例

    本文实例讲述了PHP使用header()输出图片缓存的方法.分享给大家供大家参考.具体分析如下: 在我们生成验证码时会需要直接输入图片,通常会使用到header("Content-type: image/jpeg");来实现,这里就来简单介绍一下. 很多开发中,我们试图使用header("Content-type: image/jpeg");来 输出图片,试图用一些php的图像处理技术,让输出图片更加智能和动感.但我们常常遇到新的问题,除非你规定不同的URL结构,并

  • php 禁止页面缓存输出

    复制代码 代码如下: <?php header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . 'GMT'); header('Cache-Control: no-cache, must-revalidate'); header('Pragma: no-cache'); ?>

  • 控制PHP的输出:缓存并压缩动态页面

    mod_gzip是一个Apache模块,其功能是使用Gzip压缩静态的html页面,遵循IETF标准的浏览器可以接受gzip编码(IE, Netscape等).mod_gzip可以将页面的下载时间提高4-5倍.我强烈建议你在你的web服务器上使用mod_gzip.然而,我们还必须用PHP建立我们自己的压缩引擎.在这篇文章里,我将要介绍如何使用PHP的输出控制函数来大幅加速页面载入速度. 介绍PHP的输出控制函数 PHP4中最令人满意的事是--你可以让PHP缓存所有由脚本生成的输出,在你决定把它们

  • PHP 输出缓存详解

    输出控制函数不对使用 header() 或 setcookie(), 发送的文件头信息产生影响,只对那些类似于 echo() 和 PHP 代码的数据块有作用. 我们先举一个简单的例子,让大家对Output Control有一个大致的印象: Example 1. 复制代码 代码如下: <?php ob_start(); //打开缓冲区 echo \"Hellon\"; //输出 header("location:index.php"); //把浏览器重定向到in

  • PHP输出缓存ob系列函数详解

    ob的基本原则:如果ob缓存打开,则echo的数据首先放在ob缓存.如果是header信息,直接放在程序缓存.当页面执行到最后,会把ob缓存的数据放到程序缓存,然后依次返回给浏览器.下面我说说ob的基本作用:  1)防止在浏览器有输出之后再使用setcookie().header()或session_start()等发送头文件的函数造成的错误.其实这样的用法少用为好,养成良好的代码习惯.  2)捕捉对一些不可获取的函数的输出,比如phpinfo()会输出一大堆的HTML,但是我们无法用一个变量例

  • PHP输出缓冲控制Output Control系列函数详解

    概述 以前研究过PHP的输入输出缓冲,不过博客搬家以后,原来文章找不到了,今天看到一篇好文,顺便转载过来. 简介 说到输出缓冲,首先要说的是一个叫做缓冲器(buffer)的东西.举个简单的例子说明他的作用:我们在编辑一篇文档时,在我们没有保存之前,系统是不会向磁盘写入的,而是写到buffer中,当buffer写满或者执行了保存操作,才会将数据写入磁盘.对于PHP来说,每一次像 echo 这样的输出操作,同样是先写入到了 php buffer 里,在脚本执行完毕或者执行了强制输出缓存操作,数据才会

  • php页面缓存ob系列函数介绍

    这里有缓存技术的简单介绍:http://www.jb51.net/article/4965.htm php页面缓存主要用到的是ob系列函数,如ob_start(),ob_end_flush(),ob_get_contents() 下面是编码部分. 1.初始化函数,一般是设置页面缓存路径.缓存文件命名格式等,可按个人喜好自定义.这里用到的识别ID是经加密的$_SERVER[REQUEST_URI]参数.这个函数中最后还有一个if判断:若未过缓存期,则加载缓存文件,否则加载源文件. 复制代码 代码如

  • C语言文件操作中 fgets与fputs 函数详解

    C语言文件操作中 fgets.fputs 函数详解 先给出api fgets 语法: #include <stdio.h> char *fgets( char *str, int num, FILE *stream ); 函数fgets()从给出的文件流中读取[num - 1]个字符并且把它们转储到str(字符串)中. fgets()在到达行末时停止,在这种情况下,str(字符串)将会被一个新行符结束. 如果fgets()达到[num - 1]个字符或者遇到EOF, str(字符串)将会以nu

  • 基于python内置函数与匿名函数详解

    内置函数 Built-in Functions abs() dict() help() min() setattr() all() dir() hex() next() slice() any() divmod() id() object() sorted() ascii() enumerate() input() oct() staticmethod() bin() eval() int() open() str() bool() exec() isinstance() pow() super

  • Mysql注入中的outfile、dumpfile、load_file函数详解

    在利用sql注入漏洞后期,最常用的就是通过mysql的file系列函数来进行读取敏感文件或者写入webshell,其中比较常用的函数有以下三个 into dumpfile() into outfile() load_file() 我们本次的测试数据如下 读写文件函数调用的限制 因为涉及到在服务器上写入文件,所以上述函数能否成功执行受到参数 secure_file_priv 的影响.官方文档中的描述如下 翻译一下就是 其中当参数 secure_file_priv 为空时,对导入导出无限制 当值为一

  • FreeRTOS实时操作系统的任务应用函数详解

    目录 1.获取任务系统状态 1.1函数描述 1.2参数描述 1.3返回值 1.4用法举例 2.获取当前任务句柄 2.1函数描述 2.2返回值 3.获取空闲任务句柄 3.1函数描述 3.2返回值 4.获取任务堆栈最大使用深度 4.1函数描述 4.2参数描述 4.3返回值 4.4用法举例 5.获取任务状态 5.1函数描述 5.2参数描述 5.3返回值 6.获取任务描述内容 6.1函数描述 6.2参数描述 6.3返回值 7.获取系统节拍次数 7.1函数描述 7.2返回值 8.获取调度器状态 8.1函数

  • js正则表达式常用函数详解(续)

    正则表达式对象的方法 1.test,返回一个 Boolean 值,它指出在被查找的字符串中是否存在模式.如果存在则返回 true,否则就返回 false. 2.exec,用正则表达式模式在字符串中运行查找,并返回包含该查找结果的一个数组. 3.compile,把正则表达式编译为内部格式,从而执行得更快. 正则表达式对象的属性 1.source,返回正则表达式模式的文本的复本.只读. 2.lastIndex,返回字符位置,它是被查找字符串中下一次成功匹配的开始位置. 3.input ($_),返回

  • Java 回调函数详解及使用

    Java 回调函数详解 前言: C语言中回调函数解释: 回调函数(Callback Function)是怎样一种函数呢? 函数是用来被调用的,我们调用函数的方法有两种: 直接调用:在函数A的函数体里通过书写函数B的函数名来调用之,使内存中对应函数B的代码得以执行.这里,A称为"主叫函数"(Caller),B称为"被叫函数"(Callee). 间接调用:在函数A的函数体里并不出现函数B的函数名,而是使用指向函数B的函数指针p来使内存中属于函数B的代码片断得以执行--听

  • Python 常用string函数详解

    字符串中字符大小写的变换 1. str.lower()   //小写 >>> 'SkatE'.lower() 'skate' 2. str.upper()   //大写 >>> 'SkatE'.upper() 'SKATE' 3. str.swapcase()  //大小写互换 >>> 'SkatE'.swapcase() 'sKATe' 4. str.title()   //首字母大写,其余的小写 >>> 'SkatE'.title

随机推荐