background image

PHP 入门:php

 

缓冲 output_buffering 的使用说明

本文为大家详细分析介绍了是 php 缓冲 output_buffering,需要的朋友参考下
buffer
buffer 是一个内存地址空间,Linux 系统默认大小一般为 4096(4kb),即一个内存页。主要用于
存储速度不同步的设备或者优先级不同的设备之间传办理数据的区域。通过 buffer,可以
使进程这间的相互等待变少。这里说一个通俗一点的例子,你打开文本编辑器编辑一个文
件的时候,你每输入一个字符,操作系统并不会立即把这个字符直接写入到磁盘,而是
先写入到 buffer,当写满了一个 buffer 的时候,才会把 buffer 中的数据写入磁盘,当然当
调用内核函数

flush

()的时候,强制要求把 buffer 中的脏数据写回磁盘。

 
同样的道理,当执行

echo

,

print

的时候,输出并没有立即通过 tcp 传给客户端浏览器显示, 

而是将数据写入 php buffer。php output_buffering 机制,意味在 tcp buffer 之前,建立了一新
的队列,数据必须经过该队列。当一个 php buffer 写满的时候,脚本进程会将 php buffer 中
的输出数据交给系统内核交由 tcp 传给浏览器显示。所以,数据会依次写到这几个地方:

echo

/

print

 -> php buffer -> tcp buffer -> browser

php output_buffering
默认情况下,php buffer 是开启的,而且该 buffer 默认值是 4096,即 4kb。你可以通过在
php.ini 配置文件中找到 output_buffering 配置.当

echo

,

print

等输出用户数据的时候,输出数

据都会写入到 php output_buffering 中,直到 output_buffering 写满,会将这些数据通过 tcp
传送给浏览器显示。你也可以通过 ob_start()手动激活 php output_buffering 机制,使得即便
输出超过了 4kb 数据,也不真的把数据交给 tcp 传给浏览器,因为 ob_start()将 php buffer
空间设置到了足够大。只有直到脚本结束,或者调用 ob_end_flush 函数,才会把数据发送
给客户端浏览器。
1.当 output_buffering=4096,并且输出较少数据(少于一个 buffer)

 

复制代码 代码如下:
 
<?php

for

 (

$i

 = 0; 

$i

 < 10; 

$i

++) {

echo

 

$i

 . '<br/>';

sleep(

$i

 + 1); 

//

}
?>
 
现象:不是每隔几秒就会有间断性输出,而是直到响应结束,才能看一次性看到输出,在
等待服务器脚本处理结束之前,浏览器界面一直保持空白。这是因为,数据量太小,php 
output_buffering 没有写满。写数据的顺序,依次是

echo

->php buffer->tcp buffer->browser

2.当 output_buffering=0,并且输出较少数据(少于一个 buffer)