PHP 输出缓冲区
一般的PHP脚本中,PHP标签之外的任何HTML语句将会发送到浏览器客户端,而默认的PHP的echo,print之类的输出将会被缓存.当缓存达到特定的大小或页面脚本执行,或强行刷新缓冲区才会发送到浏览器客户端.
比如,下面代码会循环完后再把输出发往浏览器
for($i=0; $i!=3;++$i){ echo date('Y-m-d h:i:s').'<br/>'; sleep(1);}
php.ini的outputing_buffer字段默认是4096,表示缓存的大小,如果大于该值则会像浏览器客户端输出.该值可以修改.
但有时需求对输出进行严格控制.就比如我想输出了100k的数据,但是想一次连续的发送到客户端,想压缩要传输的数据.php可以对输出缓存进行控制,常见的函数有:
ob_start():启动输出缓存.
ob_get_contents():得到缓存内容字符串.
ob_flush():刷新缓存.
flush():刷新缓存,php刷新缓存必须是同时调用ob_flush和flush.除非调用ob_implicit_flush(true).
ob_implicit_flush(true/false):打开关闭绝对刷新缓存方式.如果为true,则手动刷新缓存时只要调用ob_flush,反之除了调用ob_flush还要调用flush.
ob_clean():清空缓存,不关闭缓存.
ob_end_flush():刷新缓存,清空并关闭缓存.
ob_end_clean():刷新缓存,清空并关闭缓存.
php会在脚本执行时自动关闭缓存.所以可以不用显示调用ob_end_xxx.但良好的风格不应该省略这些.而且ob_start应该是和这些ob_end_xx一一对应的.
下面的代码展示锁住缓冲区一起输出:下面的输出将一起在web上显示,也就是一起刷新到浏览器.尽管他超过了默认设置的缓冲区大小.
<?php ob_start();for($i=0; $i!=10240;++$i){ echo '1'; if($i == 4096) { echo '<br/><br/>'; sleep(3); }}ob_end_flush();?>
下面的代码是演示控制脚本每输出一次,就刷新缓存向浏览器发送数据.
<?php// ob_implicit_flush(true);ob_flush();flush();for($i=0; $i!=3;++$i){ echo date('Y-m-d h:i:s').'<br/>'; ob_flush(); flush(); sleep(1);}?>
上面每循环一次就会向浏览器刷新一次当前时间.浏览器里的页面会无刷新的每隔1秒多显示一条数据.
如果把上面注释的ob_implicit_flush(true)激活,则可不用书写ob_flush()后的flush().
转自 图灵社区
发表吐槽
你肿么看?
既然没有吐槽,那就赶紧抢沙发吧!