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().


转自 图灵社区


版权声明:若无特殊注明,本文皆为《 楚天之怒 》原创,转载请保留文章出处。
本文链接:PHP 输出缓冲区 https://www.chutianzhinu.com/post-51.html
正文到此结束

热门推荐

发表吐槽

你肿么看?

你还可以输入 250 / 250 个字

嘻嘻 大笑 可怜 吃惊 害羞 调皮 鄙视 示爱 大哭 开心 偷笑 嘘 奸笑 委屈 抱抱 愤怒 思考 日了狗 胜利 不高兴 阴险 乖 酷 滑稽

评论信息框

吃奶的力气提交吐槽中...


既然没有吐槽,那就赶紧抢沙发吧!