一、概念在PHP运行过程中,产生输出的函数或运算结果可以暂时保存在PHP的缓冲区中。只有当缓冲区满了,或者PHP运行完或者需要输出的时候才会输出数据到浏览器。缓冲数据所在的区域称为PHP的输出缓冲区(OB)。2.原理①使用buffer后,在执行PHP时,如果遇到echo、print_r等输出数据的代码(其实很多函数都会产生输出),PHP会把输出的数据放到PHP自己的buffer中,等待输出;②当PHP自身的buffer接收到输出buffer内容的指令时,会将buffer中的数据输出给服务器,服务器接收到PHP输出的数据,然后将数据存入服务器自身的buffer中,并等待输出;③当服务器收到命令只想输出缓冲区的内容时,就会输出缓冲区的内容返回给浏览器。从上面可以看出,输出缓冲层并不是唯一用来缓冲输出的层,它实际上只是许多层中的一层。最后一点你必须记住的是,输出缓冲层的行为与你使用的SAPI(web或cli)有关,不同的SAPI可能有不同的行为。第一点提到的概念是,当缓冲区满了,就会输出缓冲的数据。这与SAPI有关。缓冲区主要由php.ini中的output_buffering变量控制。output_buffering默认开启,默认值为4096(4kb)。三、输出缓冲区的配置1、以我们平时使用的PHP-FPM的SAPI为例,这里总结一下PHP的ini文件的配置。主要有三个选项:output_bufferingimplicit_flushoutput_handler使用一个表来整理这三个参数的含义:注意上面三个值在运行时使用ini_set()是不能改变的。2、关于PHPCLI执行的配置,与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转换字符编码;tidy组织输出的HTML文本;⑤ob_[inflate/deflate]_handler:使用ext/http压缩输出;⑥ob_etaghandler:使用ext/http自动生成HTTPEtag;4、输出缓冲区相关方法ob_start();//开启一个outputBuffer,所有的输出信息不再直接传送到下一层,而是存储在outputbuffer中。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();//打开/关闭绝对刷新。五、outputbuffer的应用1、openbeforesession、cookie、header等设置函数:最常见的是在使用header函数之前已经输出了一些数据,会导致一些错误,比如Cannotmodifyheaderinformation–headers已经发送;出现这个错误的原因是header之前已经输出了一些数据,而在输出这些数据的同时,服务端会同时向浏览器发送一个响应状态(既然有输出,那就是这个请求有效),然后你再用header函数发送http头,就会返回这个错误。错误的意思是:HTTPheader已经发送,不能修改。所以ob_start方法可以一开始就启动。2.控制PHP程序的下载功能:通常很多人会用PHP下载文件,但是当文件过大时(比如100M),如果读入内存再发送给用户,响应时间会大大增加(甚至超时),内存占用也会大大增加(甚至溢出)。使用输出缓冲区,可以将读取的文件读入缓冲区,当达到一定大小时发送给用户,然后继续读取,达到分片的效果。这样浏览器就可以持续接收数据,而不必等到所有文件都读取完毕,同时内存也不会占用太多。3.作为静态文件缓存:需要反复读取,会读取修改频率很低的文件。第一次读取时,会放入缓冲区生成静态文件。每次读取后直接返回即可,不需要经过php处理(读取数据库等)。您可能感兴趣的文章:PHP缓冲区使用总结PHP缓冲区缓冲区实现代码刷新PHP缓冲区提速PHP5.0TIDY_PARSE_FILE缓冲区溢出漏洞解决方案php中缓冲区缓冲区使用分析Flush类输出缓冲区分析PHPob(OutputBuffer输出缓冲区)函数使用方法PHP输出缓冲区控件(OutputControl)详解php缓冲区输出实例解析PHP输出缓冲区解析PHP输出缓冲区控件OutputControl系列函数详解PHP嵌套输出Buffer代码实例文章同步发布:httpswww.geek-share.com/de...
