php ob_start 与 ob_end_flush() 是 php 的缓冲输出函数.
ob_start([string output_callback])- 打开输出缓冲区,所有的输出信息不在直接发送到浏览器,而是保存在输出缓冲区里面, 可选得回调函数用于处理输出结果信息.
ob_end_flush - 结束(发送)输出缓冲区的内容,关闭输出缓冲区.
php 输出东西,会保存在一个 php 维护的内存里,称为 buffer 也行,缓存也行,都是一个意思.然后当这个 buffer 满了,php 会自动往 web server 发送这些数据.
也就是说每次 echo,并不一定会输出东西,而是保存在 buffer 里.
ob_start() 的意思,可以理解为(但是实际上和我下面的说法有区别),这个 buffer 由
ob_ 系列函数来来控制,也就是,PHP 不会维护自己的 buffer,不会自动把 buffer 的内容自动发送到 web server,直到你
ob_end() 或者类似的 ob 操作.
ob_函数一般用来捕获当前的输出,跟效率是没什么关系的.至于为什么捕获输出,原因很多,例如我捕捉输出,缓存到一个文件里,下次请求就可以直接读这个 cache 文件的内容作为输出了.
1ob_start();
2 内容
3echoob_get_contents() ;
就是类似上面这样的代码了,说白了没有任何意义的代码.
我仔细想过之后,然后上网搜索了一下,发现相当多的初学者(技术上的初学者,不一定是 PHP 第一年生,有的人一辈子是初学者),并不理解 ob 的作用,只是网上经常把 ob 叫做输出缓冲,输出缓存,所以相当多的人就把 ob 系列函数当作是加快 PHP 页面显示的工具.
其实 ob 是 output buffering 的简称,而不是 output cache,ob 用对了是能对速度有一定的帮助,但是盲目的加上 ob 函数,只会增加 CPU 额外的负担.下面我说说 ob 的基本作用.
防止在浏览器有输出之后再使用 setcookie,或者 header,session_start 函数造成的错误.(我本以为最开始说的代码是这样的作用,但后来朋友说不是的),其实这样的用法少用为好,养成良好的代码习惯.
捕捉对一些不可获取的函数的输出,比如 phpinfo 会输出一大堆的 html,但是我们无法用一个变量例如 $info=phpinfo(); 来捕捉,这时候 ob 就管用了.
对输出的内容进行处理,例如进行 gzip 压缩,例如进行简繁转换,例如进行一些字符串替换.
生成静态文件,其实就是捕捉整页的输出,然后存成文件,经常在生成 HTML,或者整页缓存中使用.
对于刚才说的第三点中的 GZIP 压缩,可能是很多人想用,却没有真真用上的,其实稍稍修改下我朋友的代码,就可以实现页面的 gzip 压缩.
1ob_start(ob_gzhandler);
2 内容
没错,加一个 ob_gzhandler 这个回调函数就可以了,不过这么做有些小问题,一是需要 zlib 支持,二是没有判断浏览器是否支持 gzip(现在好像都支持,iphone 浏览器好像都支持了).
以前的做法是判断一下浏览器是否支持 gzip,然后用第三方的 gzip 函数来压缩 ob_get_contents() 的内容,最后 echo.
来源: http://www.jianshu.com/p/e1583df88e48