php output_buffering 缓存使用

原文 http://www.bianceng.cn/webkf/PHP/201408/44018.htm

buffer是一个内存地址空间,linux系统默认大小一般为4096(4kb)。主要用于存储速度不同步的设备或优先级不同的设备之间传递数据的区域。

通过buffer可以使进程之间的相互等待变少。

例如,当你打开一个文本编辑器,输入一个字符时,系统并不会立即写入磁盘。而是存储在buffer中,当写满一个buffer时,才会把buffer的内容写入磁盘。

当然也可以使用flush强制将buffer的数据写入磁盘。

在php中,例如 echo,print,输出并不会立即通过tcp传递给浏览器输出。而是将数据写入php buffer。当一个php buffer写满,才会通过tcp传递给浏览器。

echo /print -> php output_buffer -> tcp buffer -> browser

php output_buffering

默认情况下,php buffer是开启的,默认值是4096(4kb)。可以在php.ini中找到output_buffering 配置。知道buffer写满,才会发送到浏览器。

也可以设置ob_start(),这样即使超过默认值(4kb)也不会立即发送到浏览器,只到脚本运行完成,或者调用了ob_end_flush方法,才会输出到浏览器。

1.output_buffering=4096,输出较少的数据(少于一个buffer)

<?php  
for($i=0; $i<10; $i++){  
    echo $i.'<br>';  
    sleep(2);  
}  
?>

运行结果:等所有脚本全部运行完成后,才输出,因为数据未满一个buffer的大小。

2.output_buffering=4096,输出较少的数据(少于一个buffer),关闭output_buffering,修改php.ini的output_buffering=0

<?php  
for($i=0; $i<10; $i++){  
    echo $i.str_repeat("&nbsp;",500).'<br>'; // 当接受到的256(甚至更多)个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。  
    flush();  
    sleep(1);  
}  
?>

运行结果:因为禁用了php buffering,不需要等到脚本运行完毕就可以输出,数据没有在php buffer停留,可以看到断断续续间歇性输出。echo -> tcp buffer ->browser

3.当output_buffering=4096,输出较大数据(大于一个buffer),不使用ob_start()

<?php  
for($i=0; $i<10; $i++){  
    echo file_get_contents('f.txt').$i.'<br>';  
    sleep(1);  
}  
?>

运行结果:f.txt为一个大于4kb的文件,因为大于buffer默认值,buffer空间不够用,每当满一个buffer就会输出,所以可以看到间歇性输出。

4.当output_buffering=4096,输出较大数据(大于一个buffer),使用ob_start()

<?php  
ob_start();  
for($i=0; $i<10; $i++){  
    echo file_get_contents('f.txt').$i.'<br>';  
    sleep(1);  
}  
?>

运行结果:因为使用了ob_start(),会为buffer设置足够大的空间,因此会保存到脚本执行完毕后才会输出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值