前言
萌购物出现了一个问题,那就是登录后跳转时老出现 php 报错!吾看了两三天也没有解决问题!然后去问 sd 零酱!结果又被秒解了!程序员不容小看啊!噗噗!sd 零酱说问题出在了这个ob_start()
php 函数上!
然后给了吾一篇文章!吾先留下!以后慢慢看!噗噗~
介绍
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()
的意思,可以理解为(但是实际上和我下面的说法有区别),这个 buffe
r 由 ob_
系列函数来来控制,也就是,PHP 不会维护自己的 buffer
,不会自动把 buffer 的内容自动发送到 web server
,直到你 ob_end() 或者类似的 ob 操作。
ob_
函数一般用来捕获当前的输出,跟效率是没什么关系的。至于为什么捕获输出,原因很多,例如我捕捉输出,缓存到一个文件里,下次请求就可以直接读这个 cache 文件的内容作为输出了。
ob_start(); 内容 echo ob_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 压缩。
ob_start(ob_gzhandler); 内容
没错,加一个ob_gzhandler
这个回调函数就可以了,不过这么做有些小问题,一是需要 zlib 支持,二是没有判断浏览器是否支持 gzip(现在好像都支持,iphone 浏览器好像都支持了)。
以前的做法是判断一下浏览器是否支持 gzip,然后用第三方的 gzip 函数来压缩ob_get_contents()
的内容,最后 echo。
转载:http://www.nowamagic.net/php/php_ObStart.php