浅谈PHP中output_buffering
php  /  管理员 发布于 7年前   239
一、我们要说一下php中的缓存大概有哪些! 在PHP中,我们可以粗略的将缓存分为客户端缓存(Browser缓存),服务器端缓存(Server缓存)。由于PHP是基于B/S架构的,所以,我们可以理解为浏览器端的缓存,服务器端缓存。 在PHP中缓存的输出顺序为: 未打开php输出缓存: echo,print -> server buffering -> browser buffering -> browser display 浏览器的输出缓存:IE为256Bytes, Chrome与FireFox为1000Bytes,只有输出数据达到了这个长度或者脚本结束浏览器才会将数据输出在页面上。 二、服务器端的响应流程 A、客户端向服务器端发送请求响应! 三、OB缓存的常见用法! a、output_buffering=4096,输出较少的数据(少于一个buffer) 运行结果:等所有脚本全部运行完成后,才输出,因为数据未满一个buffer的大小。 b、output_buffering=4096,输出较少的数据(少于一个buffer),关闭output_buffering,修改php.ini的output_buffering=0 运行结果:因为禁用了OB,不需要等到脚本运行完毕就可以输出,数据没有在OB停留,可以看到断断续续间歇性输出。echo ->browser buffering -> browser display c、output_buffering=4096,输出较大数据(大于一个buffer),不使用ob_start() 运行结果:f.txt为一个大于4kb的文件,因为大于buffer默认值,buffer空间不够用,每当满一个buffer就会输出,所以可以看到间歇性输出。 d、output_buffering=4096,输出较大数据(大于一个buffer),使用ob_start() 运行结果:因为使用了ob_start(),会为buffer设置足够大的空间,因此会保存到脚本执行完毕后才会输出。 e、output_buffering=On,使用ob_start() 运行结果:abc-hello-aa-abc-hello-aa- f、output_buffering=Off,使用ob_start() 运行结果:abc-hello-aa- 输出缓冲区是可堆叠的,这即意谓着,当有一个 ob_start() 是活跃的时, 你可以调用另一个 ob_start() 。 只要确保又正确调用了 ob_end_flush() 恰当的次数即可。 如果有多重输出回调函数是活跃的,输出内容会一直按嵌套的顺序依次通过它们而被过滤。 注意:PHP5.2中,OB默认是关闭的,5.3之后默认是开启的; 常用方法: 1.ob_start 2.ob_get_contents 3.ob_end_flush 和 ob_end_clean 4.ob_flush 、flush、ob_implicit_flush flush 则会刷新程序缓存到浏览器缓存中 ob_implicit_flush 将打开或关闭绝对(隐式)刷送。绝对(隐式)刷送将导致在每次输出调用后有一次刷送操作,以便不再需要对 flush() 的显式调用 四、OB缓存的作用! OB缓存在各个方面都有应用,但是,本人知道的主要是在两个方面! b、解决Warning: Cannot modify header information - headers already sent by的错误! 但是,如果我们开启了OB缓存,那么相应头信息(一般也就是header()函数进行设置的信息),会被放入到程序缓存中! 以上所述就是本文的全部内容了,希望大家能够喜欢。
在服务器端PHP自带的缓存中,主要可以分为两大类缓存!程序缓存和OB缓存!这也是我们学习服务器端缓存的主要内容!
打开了php输出缓存: echo,print -> php output_buffering -> server buffering -> browser buffering -> browser display
B、Apache服务器加载了PHP模块,开启相应的进程(或线程)运行相应的PHP脚本页面!
C、在没有开启OB缓存的情况下,运行的结果全部都会被放到程序缓存中,然后打包发送给浏览器!浏览器对页面进行渲染,生成我们最后看到的WEB页面!
D、在开启了OB缓存的情况下,运行的结果会被分别放入到OB缓存和程序缓存中,当程序运行到最后一行的时候,就会将OB缓存中的数据刷回到程序缓存中,然后打包返回给浏览器!浏览器对页面进行渲染,生成我们看到的WEB页面!for($i=0; $i<5; $i++){ echo $i.'
'; sleep(1); }echo str_repeat(" ",1024);//这里重复输出一个空白for($i=0; $i<5; $i++){ echo $i."
"; flush(); sleep(1); }for($i=0; $i<5; $i++){ echo file_get_contents('f.txt').$i.'
'; sleep(2); }ob_start(); for($i=0; $i<5; $i++){ echo file_get_contents('f.txt').$i.'
'; sleep(2); }ob_start();echo "abc-";header("content-type:text/html;");echo "hello-";ob_end_flush();echo "aa-";echo ob_get_contents();
ob_start();echo "abc-";header("content-type:text/html;charset=utf-8");echo "hello-";ob_end_flush();echo "aa-";echo ob_get_contents();
激活output_buffering机制,一旦激活,脚本不再直接输出到浏览器,而是暂时写入php buffering区域。直到脚本运行完毕后,才发送。
获取php buffering中的数据,注意:要在ob_end_clean()前调用,否则只会得到空字符。
ob_end_flush 会输出php buffering 中的数据,但不会清空。
ob_end_clean 不会输出,只会清空php buffering中的数据。
ob_flush 会刷新php buffering 中的数据到程序缓存
a、当网站准备做网站静态化的时候,选择OB缓存是一个不错的选择!
究其发生错误的原因:是因为响应头和相应主体位置错位导致的!正常情况下,服务器返回给浏览器的相应内容,应该是:响应头+响应主体!
而其他的输出内容,如:echo print_r var_dump 等,都会先被放入OB缓存中!
等程序结束的时候,或者OB缓存关闭的实话,将OB缓存的内容在放入程序缓存中!从而保证响应头信息,始终在响应主体内容之前!您可能感兴趣的文章:
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号