在PHP运行的过程中,可以将会产生输出的函数或操作结果暂时保存在PHP的缓冲区,只有当缓冲区满了、或者PHP运行完毕、或者在必要时候进行输出,才会将数据输出到浏览器,此缓冲数据的区域称为PHP的输出缓冲区(OB)。

二、事理

①利用了缓冲区之后,当实行PHP的时候,如果碰到了echo、print_r之类的会输出数据的代码(实际上许多函数都会产生输出),PHP就会将要输出的数据放到PHP自身的缓冲区,等待输出;

动态php缓存PHP输出缓冲区具体教程 Docker

②当PHP自身的缓冲区接到指令,指示要输出缓冲区的内容时,将会把缓冲区内的数据输出到做事器上, 做事器接管到PHP输出的数据,然后再把该数据存在到做事器自身的缓冲区内,等到输出;

③当做事器接管到指令,只是要输出缓冲区的内容时, 将会把缓冲区的内容输出,返回到浏览器。

第一点观点有提到,缓冲区满了会将缓冲数据输出,这个跟SAPI有关,缓冲区紧张是通过php.ini中的output_buffering变量掌握。
output_buffering的默认是on,默认值是4096(4kb)。

三、输出缓冲区的配置

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

output_buffering

implicit_flush

output_handler

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的处理(读取数据库等)。