PHP output buffer
当 PHP
脚本有输出时,输出的内容可能经历以下过程:
program data
>> PHP output buffer
>> TCP buffer
>> client
当 PHP output buffer
激活后,脚本将不会输出内容(除http标头外),相反需要输出的内容被存储在 PHP output buffer
中。
如果 PHP output buffer
有大小限制,且输出内容超出限定的 PHP output buffer
大小时,PHP output buffer
的内容会被刷送出去,进入 TCP buffer
,PHP output buffer
重新接受新的内容
PHP 配置输出缓冲区
php.ini 的 output_buffering
控制是否激活输出缓冲区,及限定输出缓冲区大小:
配置为
On
,则不限制输出缓冲区的大小,输出的字符串全部缓存在输出缓冲区,直到脚本结束。配置为整数,如
4096
时,输出缓冲区大小限定在 4096 字节
输出缓冲区相关的函数
ob_start
打开 PHP 的输出缓冲区
ob_start ([ callable $output_callback = NULL [, int $chunk_size = 0 [, int $flags = PHP_OUTPUT_HANDLER_STDFLAGS ]]] ) : bool
output_callback
此函数把一个字符串当作参数并返回一个字符串。 当输出缓冲区被(
ob_flush()
,ob_clean()
或者相似的函数)冲刷(送出)或者被清洗的时候;或者在请求结束之际输出缓冲区内容被冲刷到浏览器的时候该函数将会被调用。 当调用 output_callback 时,它将收到输出缓冲区的内容作为参数 并预期返回一个新的输出缓冲区作为结果,这个新返回的输出缓冲区内容将被送到浏览器。 如果这个 output_callback 不是一个可以调用的函数,此函数 会返回 FALSE ,其原来的输入内容被直接送到浏览器例如可以使用
ob_gzhandler
把 gz 编码过的数据发送到支持压缩网页的浏览器。 ob_gzhandler() 会判定浏览器可以接受哪种类型的编码内容,并返回相应 的输出。这个参数 output_callback 可以通过直接给一个 NULL 值而避开。
chunk_size
默认值 0 意味着输出缓冲区大小不受限制。
在 PHP 5.4.0 之前,值 1 是一个特例值,它将输出缓冲区设置为 4096 字节。
flags
flags 参数是一个位掩码,控制可以在输出缓冲区上执行的操作。
默认设置是允许清除、刷新和移除输出缓冲区,即
PHP_OUTPUT_HANDLER_CLEANABLE | PHP_OUTPUT_HANDLER_FLUSHABLE | PHP_OUTPUT_HANDLER_REMOVABLE
或PHP_OUTPUT_HANDLER_STDFLAGS
每个标志控制对一组功能的访问,如下所述:
PHP_OUTPUT_HANDLER_CLEANABLE
ob_clean(), ob_end_clean(), and ob_get_clean().
PHP_OUTPUT_HANDLER_FLUSHABLE
ob_end_flush(), ob_flush(), and ob_get_flush().
PHP_OUTPUT_HANDLER_REMOVABLE
ob_end_clean(), ob_end_flush(), and ob_get_flush().
打开 PHP 的输出缓冲区,成功时返回 TRUE ,失败时返回 FALSE
PHP
的输出缓冲区是可以多重堆叠嵌套的,例如既在 php.ini
中开启了输出缓冲区,又在代码中使用了(甚至是多次使用) ob_start()
,那么想要关闭输出缓冲区,就要确保正确调用 ob_end_flush()
恰当的次数。
ob_get_level
返回输出缓冲机制的嵌套级别
ob_get_level ( void ) : int
返回输出缓冲机制的嵌套级别;如果输出缓冲未处于激活状态,则返回 0 。
ob_get_status
获取输出缓冲区的状态
ob_get_status ([ bool $full_status = FALSE ] ) : array
full_status
设为TRUE 返回所有有效的输出缓冲区级别的状态信息。如果设为 FALSE 或者没有设置,仅返回最 顶层输出缓冲区的状态信息。
默认返回最顶层输出缓冲区的状态信息;如果 $full_status
设为TRUE,返回所有有效的输出缓冲级别。
ob_get_status 获取的嵌套级别是从 0 开始的,ob_get_level 获取的嵌套级别是从 1 开始的
ob_get_length
返回输出缓冲区内容的长度
ob_get_length ( void ) : int
返回输出缓冲区内容的长度;如果没有激活的输出缓冲区则返回 FALSE。
ob_get_contents
返回输出缓冲区的内容
ob_get_contents ( void ) : string
返回输出缓冲区的内容,如果没有激活的输出缓冲区则返回 FALSE 。
ob_flush
冲刷出(送出)输出缓冲区中的内容
ob_flush ( void ) : void
送出缓冲区的内容(如果里边有内容的话)。
没有返回值
ob_clean
清空(擦掉)输出缓冲区
ob_clean ( void ) : void
清空(擦掉)输出缓冲区
没有返回值
ob_end_clean
清空(擦除)输出缓冲区并关闭输出缓冲
ob_end_clean ( void ) : bool
丢弃最顶层输出缓冲区的内容并关闭这个缓冲区
成功时返回 TRUE, 如果没有激活的输出缓冲区则返回 FALSE 。
ob_end_flush
冲刷出(送出)输出缓冲区内容并关闭输出缓冲区
ob_end_flush ( void ) : bool
冲刷出(送出)最顶层缓冲区的内容(如果里边有内容的话),并关闭缓冲区。
成功时返回 TRUE, 如果没有激活的输出缓冲区则返回 FALSE
ob_get_clean
得到当前输出缓冲区的内容并关闭当前输出缓冲区。
ob_get_clean ( void ) : string
返回输出缓冲区的内容,并关闭输出缓冲区。如果输出缓冲区不是活跃的,即返回 FALSE 。
ob_get_flush
刷出(送出)输出缓冲区内容,以字符串形式返回内容,并关闭输出缓冲区。
ob_get_flush ( void ) : string
返回输出缓冲区的内容,冲刷(送出)输出缓冲区的内容,关闭输出缓冲区;如果没有激活的输出缓冲区则返回FALSE 。
flush
刷新系统输出缓冲区
flush ( void ) : void
刷新 PHP 的系统写入缓冲区,而不论PHP执行在何种情况下(CGI ,web服务器等等)。该函数尝试将当前输出一直推送到浏览器
没有返回值
ob_implicit_flush
打开/关闭绝对刷送
ob_implicit_flush ([ int $flag = 1 ] ) : void
flag
设为 TRUE 打开绝对刷送,反之是 FALSE 。
绝对(隐式)刷送将导致在每次输出调用后有一次刷送操作,以便不再需要对 flush() 的显式调用。
没有返回值
对比
函数 | 获取缓冲区内容 | 冲刷(送出)缓冲区的内容 | 清空缓冲区 | 关闭缓冲区 |
---|---|---|---|---|
ob_get_contents | 是 | 否 | 否 | 否 |
ob_flush | 否 | 是 | 否 | 否 |
ob_clean | 否 | 否 | 是 | 否 |
ob_end_clean | 否 | 否 | 是 | 是 |
ob_end_flush | 否 | 是 | 是 | 是 |
ob_get_clean | 是 | 否 | 是 | 是 |
ob_get_flush | 是 | 是 | 是 | 是 |
例外
个别web服务器程序,特别是Win32下的web服务器程序,在发送结果到浏览器之前,仍然会缓存脚本的输出,直到程序结束为止。
Apache
的mod_gzip
模块如果配置了对PHP
脚本也进行压缩,则会等待脚本执行完成,获取到所有输出内容,并压缩后才会发送给浏览器,这将导致flush()
函数产生的结果不会立即被发送到客户端浏览器。Apache
的mod_fcgid
模块有其自身的输出缓冲区,通过FcgidOutputBufferSize
进行配置,默认是 65536 字节,如果没有被显式的设置为 0 ,则flush()
函数产生的结果不会立即被发送到客户端浏览器。甚至浏览器也会在显示之前,缓存接收到的内容。例如 Netscape 浏览器会在接受到换行或 html 标记的开头之前缓存内容,并且在接受到 </table> 标记之前,不会显示出整个表格。
一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。