复制代码 代码如下:
<?php
//通过 ini_set('output_buffering', 0)并不生效
//应该编辑/etc/php.ini,设置 output_buffering=0 禁用 output buffering 机制
//ini_set('output_buffering', 0); //彻底禁用 output buffering 功能
for
(
$i
= 0;
$i
< 10;
$i
++) {
echo
$i
. '<br/>';
flush
();
//通知操作系统底层,尽快把数据给客户端浏览器
sleep(
$i
+ 1);
//
}
?>
现象:与刚才显示并不一致,禁用了 php buffering 机制之后,在浏览器可以断断续续看到
间断性输出,不必等到脚本执行完毕才看到输出。这是因为,数据没有在 php
output_buffering 中停留。写数据的顺序依次是
echo
->tcp buffer->browser
3.当 output_buffering=4096.,输出数据大于一个 buffer,不调用 ob_start()
复制代码 代码如下:
#
//创建一个 4kb 大小的文件
$dd
if
=/dev/zero of=f4096 bs=4096
count
=1
<?php
for
(
$i
= 0;
$i
< 10;
$i
++) {
echo
file_get_contents
('./f4096') .
$i
. '<br/>';
sleep(
$i
+1);
}
?>
现象:响应还没结束(http 连接没有关闭),断断续续可以看到间断性输出,浏览器界面不
会一直保持空白。尽管启用了 php output_buffering 机制,但依然会间断性输出,而不是一
次性输出,是因为 output_buffering 空间不够用。每写满一个 php buffering,数据就会发送
到客户端浏览器。
4.当 output_buffering=4096, 输出数据大于一个 tcp buffer, 调用 ob_start()
复制代码 代码如下:
<?php
ob_start();
//开启 php buffer
for
(
$i
= 0;
$i
< 10;
$i
++) {
echo
file_get_contents
('./f4096') .
$i
. '<br/>';