从开始到现在的将ob缓存放入程序缓存,并且关闭ob缓存,之后的程序缓存开始发挥作用:ob_end_flush()
1.ob缓存运行方式
2.注意:在程序中如果开启ob_start(),所有的echo输出都会保存到ob缓存中,可以使用ob系列函数进行操作,如果没有,默认情况下,在程序执行结束,会把缓存中的数据发送给浏览器,如果,你使用ob_clean()类似的函数,会情况缓存中的内容,那么就不用有数据发送给浏览器
ob_start() 开启
ob_get_contents() 获取缓存中的数据
ob_clean() 清空缓存中的数据
ob_end() 关闭ob缓存
ob_end_clean() 清空缓存并关闭ob缓存
ob_flush() 刷新缓冲区【就是把ob缓存中的内容放到程序缓存中,缓存中内容就是空了,默认是在程序执行完后再放到程序缓存中,用此函数可以在程序执行时任意时候放到程序缓存中】
flush() 把程序缓存内容推送到浏览器【一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。】
说的简单点:默认情况下,php会把输出的内容放到【程序缓存】中,待程序跑完,把【程序缓存】中的东西全部抛到浏览器中;现在使用ob缓存,开启后,所有的输出都会放到【ob缓存】中,头信息(header)等这些依旧存放到【程序缓存】中,待程序跑完,【ob缓存】中的内容会被放到【程序缓存】内容后面,再送到浏览器。ob_flush()是把【ob缓存】中的内容放到【程序缓存】中,之前只有待程序跑完才会把【ob缓存】内容放到【程序缓存】中,现在用ob_flush()就可以在任意时候送到【程序缓存】中;flush()函数的作用是把【程序缓存】中的数据抛到浏览器中;
总结:ob_flush()把ob缓存中的内容放到程序缓存
flush()是把程序缓存中的内容送到浏览器缓存中
以下来自脚本之家:
ob,输出缓冲区,是output buffering的简称,而不是output cache。ob用对了,是能对速度有一定的帮助,但是盲目的加上ob函数,只会增加CPU额外的负担
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系列函数中常用函数集锦
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 代码的数据块有作用。
如果由于某种原因你不想在php.ini中加上这行代码,你还可以通过PHP源文件所在目录的.htaccess文件改变默认的服务器行为(不压缩),语法如下:
转载来自:http://blog.csdn.net/Jye13/article/details/9069505
http://www.cnblogs.com/hanyouchun/p/4058994.html