PHP的ob缓冲区(output buffering)详解

2018-02-26 15:16:00
linefo
原创
869


网上的资料都喜欢叫做ob缓存,但说到缓存我们往往想到诸如文件缓存、memcache之类,所以叫做缓冲区可能更合适


写在前面


在了解ob缓存之前,先看下面这个例子:


<?php
	ob_end_flush(); // PHP5.3以后默认开启ob缓冲区,所以这里关闭它
	
	echo "test";
	setcookie("name", "value");


运行结果:



上面这段代码先关闭了ob缓冲区,然后echo输出了一个值,最后又设置了一个cookie,结果是报错的,cookie值没有设置成功。


我们知道,setcookie、header、session_start等发送头部信息的函数使用时,它们前面不能有任何输出(echo、print等),否则无法正常执行,即没办法设置头部信息(因为HTTP协议规范中,客户端浏览器需要先处理头部信息时),所以上面的报错是可以理解的。


但如果我们把ob_end_flush()注释掉(PHP版本>=5.3默认打开ob缓冲区),先使用echo也不会报错。


为什么呢?


ob缓冲区原理


我们知道程序肯定是由上往下执行的,所以上面的程序,肯定是先执行了echo才设置cookie的。

但开启ob缓冲区后没报错,说明最后打包发送给浏览器的数据,cookie设置的头部信息在echo的内容之前。


说到这里你应该差不多明白了。


开启ob缓冲区后,echo等输出的内容会先放到缓冲区里面,待程序执行到最后时,再把输出内容放出来。


ob缓冲区的作用


由上面可知开启ob缓冲区的一个基本作用:保证头部信息的正常设置;当然我们细心的话,可以通过规范的代码避免这个问题。

我们还可以利用它的特性,去做一些更有价值的事情:

(1)输出内容的统一预处理;如果每段有输出的代码我们都单独处理,就会比较麻烦,但通过操作存放在ob缓冲区的内容,我们可以做到统一预处理(比如过滤或替换某些字符,当然还可以进行gzip压缩输出内容等等)

(2)捕捉对一些不可获取的函数的输出,比如phpinfo()会输出一大堆的HTML,但是我们无法用一个变量例如$info=phpinfo();来捕捉,这时候ob就管用了。

(3)生成静态的网页内容文件,其实就是捕捉整页的输出,然后存成文件。经常在生成HTML,或者整页缓存中使用。

——具体要看怎么使用......


ob缓冲区设置


php.ini的output_buffering项可以设置ob缓冲区的开启和关闭(5.3版本后默认开启),数值代表缓冲区大小,单位是字节。


ob相关函数


这个后面补,其实理解原理以后函数只不过是操作的方式而已......

文章分类
联系我们
联系人: Mr.Chen
QQ: 185391277