与输出缓冲区有关的配置
在PHP.INI中,有两个跟缓冲区紧密相关的配置项
1.output_buffering
该配置直接影响的是php本身的缓冲区,有3种配置参数.on/off/xK(x为某个整型数值);
on - 开启缓冲区
off - 关闭缓冲区
256k - 开启缓冲区,而且当缓冲区的内容超过256k的时候,自动刷新缓冲区(把数据发送到apache);
2.implicit_flush
该配置直接影响apache的缓冲区,有2种配置参数. on/off
on - 自动刷新apache缓冲区,也就是,当php发送数据到apache的缓冲区的时候,不需要等待其他指令,直接就把输出返回到浏览器
off - 不自动刷新apache缓冲区,接受到数据后,等待刷新指令
而默认直接是开启缓冲区的,所以我们可以直接不用ob_start(),所以我先把缓冲区关闭
下面几个函数的用法
- ob_start() - 打开缓冲区
- ob_get_contents() - 返回输出缓冲区的内容
- ob_flush() - 冲刷出(送出)输出缓冲区中的内容
- ob_clean() - 清空(擦掉)输出缓冲区
- ob_end_flush() - 冲刷出(送出)输出缓冲区内容并关闭缓冲
- ob_end_clean() - 清空(擦除)缓冲区并关闭输出缓冲
- flush() - 刷新输出缓冲
ob_start()在服务器打开一个缓冲区来保存所有的输出。所以在任何时候使用echo ,输出都将被加入缓冲区中,直到程序运行结束或者使用ob_flush()来结束。然后在服务器中缓冲区的内容才会发送到浏览器,由浏览器来解析显示。
ob_start();
echo "Hello ";
$out1 = ob_get_contents();
echo "World";
$out2 = ob_get_contents();
输出:
Hello World
如果只是想要存储缓存区而不是输出的话加上ob_end_clean();
ob_start();
echo "Hello ";
$out1 = ob_get_contents();
echo "World";
$out2 = ob_get_contents();
ob_end_clean();
可以看到浏览器上没有任何输出,这时我们加上var_dump来看看out1、out2两个变量
ob_start();
echo "Hello ";
$out1 = ob_get_contents();
echo "World";
$out2 = ob_get_contents();
ob_end_clean();
var_dump($out1, $out2);
输出:
string(6) "Hello " string(11) "Hello World"
接下来讲ob_clean()跟ob_end_clean()的区别
使用 ob_end_clean()
扫描二维码关注公众号,回复: 2407739 查看本文章
ob_start();
echo "Hello ";
$out1 = ob_get_contents();
echo "World1";
$out2 = ob_get_contents();
ob_end_clean();
echo "World2<br>";
echo "World3<br>";
$out3 = ob_get_contents();
var_dump($out3);
输出:
World2
World3
bool(false)
使用 ob_clean()
ob_start();
echo "Hello ";
$out1 = ob_get_contents();
echo "World1";
$out2 = ob_get_contents();
ob_clean();
echo "World2<br>";
echo "World3<br>";
$out3 = ob_get_contents();
var_dump($out3);
输出:
World2
World3
string(20) "World2
World3
"
这里我们对out3使用转义函数
var_dump(htmlentities($out3));
输出:
World
World
string(32) "World<br/>World<br/>"
解释
ob_end_clean() 跟ob_clean() 都是清空了缓冲区,不让echo输出到浏览器,这是共同点,而不同点是ob_end_clean()还关闭了缓冲区
接下来讲ob_end_flush()跟ob_flush()跟flush()的区别
使用ob_end_flush()
ob_start();
echo "Hello<br/>";
$out1 = ob_get_contents();
echo "World1<br/>";
$out2 = ob_get_contents();
ob_end_flush();
echo "World2<br/>";
echo "World3<br/>";
$out3 = ob_get_contents();
var_dump(htmlentities($out3));
输出
Hello
World1
World2
World3
string(0) ""
补充:这里为了显示容易观察,我全部都给了<br>
使用ob_flush()
ob_start();
echo "Hello<br/>";
$out1 = ob_get_contents();
echo "World1<br/>";
$out2 = ob_get_contents();
ob__flush();
echo "World2<br/>";
echo "World3br/>";
$out3 = ob_get_contents();
var_dump(htmlentities($out3));
输出
Hello
World1
World2
World3
string(32) "World2<br/>World3<br/>"
使用flush()
ob_start();
echo "Hello<br/>";
$out1 = ob_get_contents();
echo "World1<br/>";
$out2 = ob_get_contents();
flush();
echo "World2<br/>";
echo "World3br/>";
$out3 = ob_get_contents();
var_dump(htmlentities($out3));
输出
Hello
World1
World2
World3
string(67) "Hello<br/>World1<br/>World2<br/>World3<br/>"
区别
可以看出ob_end_flush() 是输出了缓冲区的内容并且关闭了缓冲区,而ob_flush()只是刷出了缓冲区内容,相当于将缓冲区清空,而flush()输出了缓冲区内容也没有将缓冲区清空,所以下面的缓冲区内容还会继续追加。
总结
只能在实践中继续成长,有什么不对的地方望大家指出。