PHP基础之输出缓冲区基本概念、原理分析-php教程

资源魔 42 0

1、概念

正在PHP运转的进程中,能够将会孕育发生输入的函数或操作后果临时保留正在PHP的缓冲区,只有当缓冲区满了、或许PHP运转终了、或许正在须要时分进行输入,才会将数据输入到阅读器,此缓冲数据的区域称为PHP的输入缓冲区(OB)。

2、原理

①应用了缓冲区之后,当执行PHP的时分,假如碰着了echo、print_r之类的会输入数据的代码(实际上许多函数城市孕育发生输入),PHP就会将要输入的数据放到PHP本身的缓冲区,期待输入;

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

③当效劳器承受到指令,只是要输入缓冲区的内容时, 将会把缓冲区的内容输入,前往到阅读器。

39945a244cf02dbaeb0be1ada305cd59.jpg下面能够看出,输入缓冲区层没有是惟一用于缓冲输入的层,它实际上只是不少层中的一个。最初一点你要记住输入缓冲区层的行为跟你应用的SAPI(web或cli)相干,没有同的SAPI可能有没有同的行为。

第一点概念有提到,缓冲区满了会将缓冲数据输入,这个跟SAPI无关,缓冲区次要是经过php.ini中的output_buffering变量管制。output_buffering的默许是on,默许值是4096(4kb)。

3、输入缓冲区的设置装备摆设

一、以咱们通常应用的PHP-FPM这类SAPI为例,这里总结一下php的ini文件设置装备摆设,次要为三个选项:

output_buffering
implicit_flush
output_handler

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

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

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

二、对于PHP CLI形式执行时的设置装备摆设,与FPM没有太同样,有几点需求留意的是:

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

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

三、对于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;

4、输入缓冲区相干办法

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(); //关上/封闭相对刷送。

5、输入缓冲区的使用

一、正在session、cookie、header等设置函数以前开启:

最多见的就是正在应用header函数以前,就曾经输入了某些数据,这样会招致某些谬误,例如 Cannot modify header information – headers already sent by;

呈现这个谬误的缘由是, 正在header以前曾经输入了某些数据,而输入这些数据的同时, 效劳器将会同时发送一个呼应状态到阅读器上(既然有输入,即这个申请是无效的),而厥后你又再次应用header函数

发送http头,则会前往这个谬误,谬误的意义是:HTTP头曾经发送进来了,你不克不及对他再做修正。

因而能够正在扫尾先开启ob_start办法。

二、管制PHP顺序的下载性能:

通常不少人会用PHP完成文件下载,然而当一个文件巨细过年夜(例如100M)时,假如先全副读入内存再传送给用户,会招致呼应工夫年夜年夜加长(乃至超时),同时内存占用也会年夜年夜添加(乃至溢出)。

应用输入缓冲,能够将读取的文件读入缓冲区,达到肯定巨细时传送给用户,再持续读取,完成分片的成果。这样阅读器就能够继续地承受到数据,而不用比及一切文件读取终了,同时内存也没有会占用太年夜。

三、作为动态文件缓存:

将需求屡次重复读取,而且求改频次很低的文件,第一次读取时放入缓冲区,天生动态文件,之后每一次读取能够间接前往而没有需求进过php的解决(读取数据库等)。

更多PHP相干技巧文章,请拜访PHP教程栏目进行学习!

以上就是PHP根底之输入缓冲区根本概念、原理剖析的具体内容,更多请存眷资源魔其它相干文章!

标签: php php开发教程 php开发资料 php开发自学 输出缓冲区 基本概念 原理分析

抱歉,评论功能暂时关闭!