输出缓冲

什么是输出缓冲?

摘自stackoverflow的一段回答
如果没有输出缓冲(默认值),当PHP通过您的脚本处理时,您的HTML将被分批发送到浏览器。使用输出缓冲,您的HTML存储在变量中,并在脚本末尾作为一个整体发送到浏览器。

Web开发人员的输出缓冲优势

单独启用输出缓冲会减少下载和呈现HTML所需的时间,因为当PHP处理HTML时,它不会被分批发送到浏览器。
我们可以用PHP字符串做的所有花哨的东西,我们现在可以将整个HTML页面作为一个变量。

ob_flush

先看看官网说的
image.png
ob_flush 输出缓冲区中的内容(如果里边有内容的话)这里说的缓冲区就是php本身的buffer ,buffer的开启可以看php.ini
image.png

开启后默认的大小为4096个字节
也就是说当我们用php 进行echo ,print_r的时候数据是不会立马输出到浏览器的,而是缓存在php的buffer里面

flush - 刷新输出缓冲
刷新PHP程序的缓冲,而不论PHP执行在何种情况下(CGI ,web服务器等等)。该函数将当前为止程序的所有输出发送到用户的浏览器。
flush() 函数不会对服务器或客户端浏览器的缓存模式产生影响。因此,必须同时使用 ob_flush()flush() 函数来刷新输出缓冲。

于是乎得到的一个总结:php输出缓冲激活后,php会把输出的内容储存在buffer里面,但是如果使用ob_flush,flush 的话则会强制把内容输出到客户端

于是实践以下 ,每个一秒输出下时间

ob_start();//输出缓冲激活
for ($i=3; $i>0; $i--)
{
    echo date("Y-m-d H:i:s")."<br/>";
    ob_flush();
    flush();
    sleep(1);
}

通过浏览器观看,结果并没能像预期的没秒输出一次,而是等循环结束一起输出了
image.png

继续看官方文档
image.png

嗯!个别web服务器也有自己的buffer,有些浏览器也有自己的显示规则
如图
image.png

嗯嗯,如此那么我稍微改下以上PHP代码,因为默认的输出缓冲是4096字节,那么在输出当前时间前输出4096字节这样就能刷出输出缓冲了

ob_start();
$str = "";
for($j=1;$j<4096;$j++)
{
     $str .=" ";
}
for($i=0;$i<10;$i++){
    sleep(1);
    echo $str; //先输出4096个字节
    echo date("Y-m-d H:i:s")."<br/>\n";
    flush();
    ob_flush();
}

为了避免浏览器带来的影响,于是php-cli模式下运行上面的php代码,果然能能每秒打印一次时间了,如果注释ob_flush,flush则要等循环结束才一次打印出来

总结:输出缓冲的流程 php buffer -> web Server buffer -> 浏览器的buffer,php激活输出缓冲后,输出的内容将会存储在buffer里面,然后一次输出到客户端

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 1

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
1
粉丝
0
喜欢
3
收藏
0
排名:3318
访问:81
私信
所有博文
社区赞助商