|
关于
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
的第一篇博客,以后会多多经营,请码友们多指教。
|
|
|