基于PHP的输出缓冲区基本概念和原理分析
本文展示了PHP基础的输出缓冲区。分享给大家参考,如下:
一.概念
在PHP运行过程中,输出函数或运算结果可以暂时保存在PHP的缓冲区中。只有当缓冲区满了,或者PHP完全运行了,或者需要的时候,数据才会输出到浏览器。这个缓冲数据区被称为PHP的输出缓冲区(OB)。
二、原则
(1)使用缓冲区后,在执行PHP时,如果遇到echo、print_r等会输出数据的代码(其实很多函数都会产生输出),PHP会把要输出的数据放入PHP自己的缓冲区,等待输出;
(2)当PHP的缓冲区收到输出缓冲区内容的指令时,缓冲区中的数据会输出到服务器,服务器会接收PHP输出的数据,然后将数据存储在服务器的缓冲区中,直到输出;
(3)当服务器收到指令,只想输出缓冲区的内容时,会输出缓冲区的内容,返回给浏览器。
从上面可以看出,输出缓冲层并不是缓冲输出的唯一层,实际上它只是众多层中的一层。最后,您应该记住,输出缓冲层的行为与您使用的SAPI(web或cli)相关,不同的SAPI可能有不同的行为。
第一个概念提到缓冲区满了才会输出缓冲的数据,这和SAPI有关,缓冲区主要由php.ini中的output_buffering变量控制,默认情况下Output_buffering为on,默认为4096(4kb)。
三.输出缓冲器的配置
1.以我们通常使用的SAPI、php-FPM为例,这里我们总结一下php的ini文件配置,主要包括三个选项:
output _ bufferingimplicit _ flush output _ handler
使用表格阐明这三个参数的含义:
请注意,在运行时使用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 _[充气/放气] _ 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();//打开/关闭绝对刷牙。
动词(verb的缩写)输出缓冲器的应用
1.在设置会话、cookie和标头等功能之前打开:
最常见的是,有些数据在使用header函数之前就已经输出了,这会导致一些错误,比如不能修改header信息——header已经发送了;
出现此错误的原因是在头之前已经输出了一些数据,当数据输出时,服务器会同时向浏览器发送一个响应状态(因为有输出,所以请求有效),然后您再次使用头函数
如果发送http头,将返回此错误。错误表示:HTTP头已经发送,不能修改。
因此,您可以在开始时打开ob_start方法。
2.控制PHP程序的下载功能:
通常很多人用PHP下载文件,但是当一个文件太大(比如100M)时,如果所有文件在传输给用户之前都读入内存,响应时间会大大延长(甚至超时),内存占用也会大大增加(甚至溢出)。
使用输出缓冲区,可以将读取的文件读入缓冲区,达到一定大小后发送给用户,然后继续读取,从而达到分片的效果。这样浏览器就可以连续接收数据,不需要等待所有文件被读取,内存也不会占用太多。
3.作为静态文件缓存:
需要多次重复读取、修改频率较低的文件,在第一次读取时放入缓冲区,生成静态文件,每次读取后可以直接返回,无需php处理(读取数据库等)。).
更多对PHP相关内容感兴趣的读者可以查看本网站专题:《php缓存技术总结》、《php面向对象程序设计入门教程》、《PHP基本语法入门教程》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》、《php常见数据库操作技巧汇总》、0103010
希望本文对PHP编程有所帮助。
版权声明:基于PHP的输出缓冲区基本概念和原理分析是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。