1、概念php
在PHP运行的过程当中,能够将会产生输出的函数或操做结果暂时保存在PHP的缓冲区,只有当缓冲区满了、或者PHP运行完毕、或者在必要时候进行输出,才会将数据输出到浏览器,此缓冲数据的区域称为PHP的输出缓冲区(OB)。html
2、原理web
①使用了缓冲区以后,当执行PHP的时候,若是碰到了echo、print_r之类的会输出数据的代码(实际上许多函数都会产生输出),PHP就会将要输出的数据放到PHP自身的缓冲区,等待输出;数据库
②当PHP自身的缓冲区接到指令,指示要输出缓冲区的内容时,将会把缓冲区内的数据输出到服务器上, 服务器接受到PHP输出的数据,而后再把该数据存在到服务器自身的缓冲区内,等到输出;浏览器
③当服务器接受到指令,只是要输出缓冲区的内容时, 将会把缓冲区的内容输出,返回到浏览器。缓存
上面能够看出,输出缓冲区层不是惟一用于缓冲输出的层,它实际上只是不少层中的一个。最后一点你要记住输出缓冲区层的行为跟你使用的SAPI(web或cli)相关,不一样的SAPI可能有不一样的行为。服务器
第一点概念有提到,缓冲区满了会将缓冲数据输出,这个跟SAPI有关,缓冲区主要是经过php.ini中的output_buffering变量控制。output_buffering的默认是on,默认值是4096(4kb)。cookie
3、输出缓冲区的配置session
一、以咱们一般使用的PHP-FPM这种SAPI为例,这里总结一下php的ini文件配置,主要为三个选项:函数
output_buffering
implicit_flush
output_handler
经过一个表格来理清一下这三个参数的含义:
注意,以上三个值不能在运行时使用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缓冲区为你的站点加速
PHP5.0 TIDY_PARSE_FILE缓冲区溢出漏洞的解决方案
php中的buffer缓冲区用法分析
php flush类输出缓冲剖析
php中ob(Output Buffer 输出缓冲)函数使用方法
PHP 输出缓冲控制(Output Control)详解
php缓冲输出实例分析
剖析 PHP 中的输出缓冲
PHP输出缓冲控制Output Control系列函数详解
PHP嵌套输出缓冲代码实例
文章同步发布: https://www.geek-share.com/de...