• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏幻天博客吧
  • 欢迎来到铃音的私人博客! QQ群

[教程]PHP ob_start() 函数介绍

兴趣 天空の铃音 5年前 (2014-10-19) 2956次浏览 已收录 1个评论 扫描二维码
文章目录[隐藏]

yande.re 256352 sample

前言

萌购物出现了一个问题,那就是登录后跳转时老出现 php 报错!吾看了两三天也没有解决问题!然后去问 sd 零酱!结果又被秒解了!程序员不容小看啊!噗噗!sd 零酱说问题出在了这个ob_start()php 函数上!
然后给了吾一篇文章!吾先留下!以后慢慢看!噗噗~

介绍

php ob_startob_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 文件的内容作为输出了。

ob_start();
内容
echo ob_get_contents() ;

就是类似上面这样的代码了,说白了没有任何意义的代码。
我仔细想过之后,然后上网搜索了一下,发现相当多的初学者(技术上的初学者,不一定是 PHP 第一年生,有的人一辈子是初学者),并不理解ob的作用,只是网上经常把ob叫做输出缓冲,输出缓存,所以相当多的人就把 ob 系列函数当作是加快 PHP 页面显示的工具。
其实oboutput buffering的简称,而不是output cacheob用对了是能对速度有一定的帮助,但是盲目的加上 ob 函数,只会增加 CPU 额外的负担。下面我说说 ob 的基本作用。
防止在浏览器有输出之后再使用setcookie,或者headersession_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


转载请注明 - [教程]PHP ob_start() 函数介绍 - 幻想天空 - 魔王殿 - 铃音の小屋
喜欢 (1)
[不公开]
分享 (0)
关于作者:
美国服务器正在努力恢复中!目前系统升级完善,功能可以使用!现在来申请免费空间无需填表哟!
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(1)个小伙伴在吐槽
  1. 加油~~~顺路过来看看,结果这图这么露真的好吗= =
    风铭月2014-10-26 18:49 回复 Windows XP | Chrome 37.0.2062.122