关于 ob_start 的作用在此不做过多描述,网上很多。
请看下面的小程序 ( 在看之前,说明一下,在 php.ini 中设置 output_buffering=on)
<?php
ob_start();
echo str_repeat(' ', 1000); //Chrome和FF缓存1000Bytes,这里用来先将浏览器缓存用掉,但是很疑惑这一行输出为什么没有被output_buffering存起来,而是直接输出了
for ($i = 0; $i < 5; $i++) {
echo $i . '<br />';
ob_flush();
flush();
sleep(1);
}
?>
如果对 ob_start 很熟悉的话,应该会判断出结果:直接输出了 0 、 1 、 2 、 3 、 4 ;有人很奇怪为什么会出现这个情况,而不是 sleep 1s 后输出一个。这个暂不解释,在看一下下面这个程序:
<?php
ob_start();
echo str_repeat(' ', 1000); //Chrome和FF缓存1000Bytes,这里用来先将浏览器缓存用掉,但是很疑惑这一行输出为什么没有被output_buffering存起来,而是直接输出了
for ($i = 0; $i < 5; $i++) {
echo $i . '<br />';
ob_flush();
flush();
sleep(1);
}
ob_end_flush();
for ($i = 0; $i < 5; $i++) {
echo $i . '<br />';
ob_flush();
flush();
sleep(1);
}
?>
结果是先输出了 0 、 1 、 2 、 3 、 4 然后每 sleep 1s 输出一个数字。
因为, ob_start 函数是有堆叠性的,也就是说, ob_start 一般要和 ob_end_flush 配合使用。
先说一下第一个程序,在 php 配置文件内已经开启了 output_buffering 暂且编号 1 ,在程序中又因为 ob_start 的原因开启了另一缓冲区暂且编号 2 (请明白是缓冲区 buffering ,而不是 cache ),因为 ob_flush 是刷新 php 缓冲区,而不是关闭,所以,每 sleep 1s 只是刷新了缓冲区 2 ,所以会等待输出结束或者超过 buffering 的值时才会输出。而第 2 个程序因为关闭了一个 cache 所以先输出了 0 、 1 、 2 、 3 、 4 然后每 sleep 1s 输出一个数字。
这个算是迎接 2013 的第一篇博客,以后会多多经营,请码友们多指教。