PHP输出缓冲区(一):基础
PHP Web开发中,总会碰到需要使用PHP输出缓冲区的情况,本文总结了PHP输出缓冲区的原理和使用方法。
一、PHP输出过程
PHP在执行了输出命令(例如echo等)后,数据是如何返回用户的呢,大概流程如下:
PHP 输出缓冲区
Web Server
Web Server 输出缓冲区
操作系统内核
……(只讨论到这)
PHP运行的结果先放入缓冲区,只有当缓冲区满了或者PHP运行完毕,才将数据输出去。缓冲区是通过php.ini中的output_buffering变量控制。output_buffering的默认是on,默认值是4096(4kb)。
Web Server通过SAPI收到PHP的输出,这里Web Server也会有自己的缓冲区,甚至有的模块有自己的缓冲区,例如Apache的mod_gzip,可能自己进行输出缓冲区,这将导致flush()函数产生的结果不会立即被发送到客户端浏览器。Web Server的缓冲区填满之后,将数据发送至内核进一步处理。
PHP有两个函数ob_flush()和flush(),官网的解释都是将缓冲区的数据输出,使用的顺序是ob_flush()–>flush(),其实真正操作PHP输出缓冲区的函数是ob_flush(),但是这样做不一定能将数据直接发送给客户端,因为还有Web Server的输出缓冲区,所以flush()是使Web Server的缓冲区数据输出。
为什么PHP的函数可以控制Web Server呢,这就要研究SAPI了,这里有两篇文章介绍CGI SAPI
可以看看其中关于sapi_cgibin_flush的解释。
二、PHP关于缓冲区的配置
在php.ini里有三个配置,如下:
名字
默认 | 可修改范围 | 更新日志 | |
---|---|---|---|
output_buffering | on/4096 | PHP_INI_PERDIR | |
output_handler | NULL | PHP_INI_PERDIR | 自 PHP 4.0.4 起可用 |
implicit_flush | “0” | PHP_INI_ALL | 在 PHP <= 4.2.3 版本中是 PHP_INI_PERDIR |
- output_buffering
该选项设置为 On 时,将在所有的脚本中使用输出控制。如果要限制输出缓冲区的最大值,可将该选项设定为指定的最大字节数(例如 output_buffering=4096)。从PHP 4.3.5 版开始,该选项在 PHP-CLI 下总是为 Off。
- output_handler string
缓冲区输出时的回调函数。例如,将 output_handler 设置为 mb_output_handler()时,字符的编码将被修改为指定的编码。设置的任何处理函数,将自动的处理输出缓冲。但是这里必须设置PHP内置函数,想自定义请使用ob_start()的方式。
- implicit_flush boolean
默认为 FALSE。如将该选项改为 TRUE,PHP 将使输出层,在每段信息块输出后,自动刷新。这等同于在每次使用 print、echo 等函数或每个 HTML 块之后,调用 PHP 中的 flush() 函数。
要注意,不能在运行时使用ini_set()函数修改这几个选项的值。这些选项的值会在PHP程序启动的时候,还没有运行任何脚本之前解析,输出缓冲区已经启动并激活,虽然可能改变了配置项的值,但是并不会生效。
本文转载自:https://caoyi.me/php-output-buffer-1/