百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>网页制作> PHP根基之导出缓冲区根本概念、道理剖析
分享文章到:

PHP根基之导出缓冲区根本概念、道理剖析

发布时间:09/01 来源:未知 浏览: 关键词:

一、概念

在PHP运转的历程中,可以将会发生输出的函数或操纵结果临时留存在PHP的缓冲区,只要当缓冲区满了、或者PHP运转完毕、或者在必要时候停止输出,才会将数据输出到阅读器,此缓冲数据的区域称为PHP的输出缓冲区(OB)。

二、道理

①使用了缓冲区之后,当施行PHP的时候,假如碰到了echo、print_r之类的会输出数据的代码(实际上很多函数都会发生输出),PHP就会将要输出的数据放到PHP本身的缓冲区,等候输出;

②当PHP本身的缓冲区接到指令,指示要输出缓冲区的内容时,将会把缓冲区内的数据输出到效劳器上, 效劳器接受到PHP输出的数据,然后再把该数据存在到效劳器本身的缓冲区内,比及输出;

③当效劳器接受到指令,只是要输出缓冲区的内容时, 将会把缓冲区的内容输出,返回到阅读器。

39945a244cf02dbaeb0be1ada305cd59.jpg上面可以看出,输出缓冲区层不是独一用于缓冲输出的层,它实际上只是许多层中的一个。最后一点你要记住输出缓冲区层的行动跟你使用的SAPI(web或cli)相关,不一样的SAPI大概有不一样的行动。

第一点概念有提到,缓冲区满了会将缓冲数据输出,这个跟SAPI有关,缓冲区主如果通过php.ini中的output_buffering变量操纵。output_buffering的默许是on,默许值是4096(4kb)。

三、输出缓冲区的配置

1、以我们平常使用的PHP-FPM这种SAPI为例,这里总结一下php的ini文件配置,主要为三个选项:

output_buffering
implicit_flush
output_handler

通过一个表格来理清一下这三个参数的含义:

600e7cad-350c-4585-900f-7d29c99d864c.jpg

留意,以上三个值不克不及在运转时使用ini_set()改这几个选项的值。

2、关于PHP CLI方式施行时的配置,与FPM不太一样,有几点需要留意的是:

(1) output_buffering参数默许是不开启的,

(2) implicit_flush参数默许被置为1(开启)。

3、关于output_handler设定回调函数,可参照 一下几个常用设定:

①ob_gzhandler : 使用ext/zlib紧缩输出;

②mb_output_handler : 使用ext/mbstring转换字符编码;

③ob_iconv_handler : 使用ext/iconv转换字符编码;

④ob_tidyhandler : 使用ext/tidy整理输出的HTML文本;

⑤ob_[inflate/deflate]_handler : 使用ext/http紧缩输出;

⑥ob_etaghandler : 使用ext/http主动生成HTTP的Etag;

四、输出缓冲区相关办法

ob_start(); //翻开一个输出缓冲区,所有的输出信息不再直接发送到下一层,而是留存在输出缓冲区里面。
ob_clean(); //删除内部缓冲区的内容,不关闭缓冲区(不输出)。
ob_end_clean(); //删除内部缓冲区的内容,关闭缓冲区(不输出)。
ob_get_clean(); //返回内部缓冲区的内容,关闭缓冲区。
ob_flush(); //发送缓冲区内容到下一层,删除缓冲区内容,不关闭缓冲区。
ob_end_flush(); //发送缓冲区内容到下一层,删除缓冲区的内容,关闭缓冲区。
ob_get_flush(); //返回缓冲区的内容,并关闭缓冲区,再开释缓冲区的内容。
ob_get_contents(); //返回缓冲区的内容,不输出。
ob_get_length(); //返回缓冲区的长度,假如缓冲区未被激活,则返回FALSE。
ob_get_status() ; //得到所有输出缓冲区的状态。
ob_implicit_flush(); //翻开/关闭绝对刷送。

五、输出缓冲区的利用

1、在session、cookie、header等设定函数此前开启:

最常见的就是在使用header函数此前,就已经输出了某些数据,这样会致使某些错误,例如 Cannot modify header information – headers already sent by;

显现这个错误的缘由是, 在header此前已经输出了某些数据,而输出这些数据的同时, 效劳器将会同时发送一个响应状态到阅读器上(既然有输出,即这个恳求是有效的),而其后你又再次使用header函数

发送http头,则会返回这个错误,错误的意思是:HTTP头已经发送出去了,你不克不及对他再做修改。

因此可以在开头先开启ob_start办法。

2、操纵PHP程序的下载功效:

平常许多人会用PHP实现文件下载,但是当一个文件大小过大(例如100M)时,假如先全部读入内存再传送给会员,会致使响应时间大大加长(乃至超时),同时内存占用也会大大增添(乃至溢出)。

使用输出缓冲,可以将读取的文件读入缓冲区,到达必然大小时传送给会员,再连续读取,实现分片的结果。这样阅读器就可以连续地接受到数据,而不必比及所有文件读取完毕,同时内存也不会占用太大。

3、作为静态文件缓存:

将需要屡次重复读取,并且求改频率很低的文件,第一次读取时放入缓冲区,生成静态文件,之后每次读取可以直接返回而不需要进过php的处置(读取数据库等)。

更多PHP相关技术文章,请拜访PHP教程栏目停止学习!

以上就是PHP根基之输出缓冲区根本概念、道理剖析的具体内容,更多请关注百分百源码网其它相关文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有158人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板