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

 

    1.深入理解Zend SAPIs(Zend SAPI Internals)

    2.SAPIs

 

可以看看其中关于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/

posted on 2017-03-11 15:16  wpjamer  阅读(204)  评论(0编辑  收藏  举报

导航