php ob_flush,flush在ie中缓冲无效的消除情势

PHP程序的缓冲,而无论是PHP实施在何种景况下(CGI
,web服务器等等)。该函数将日前结束程序的全部出口发送到用户的浏览器。
flush()
函数不会对服务器或客户端浏览器的缓存格局发生震慑。因而,必须同有时间使用
ob_flush() 和flush() 函数来刷新输出缓冲。
分级web服务器程序,特别是Win32下的web服务器程序,在发送结果到浏览器在此以前,还是会缓存脚本的出口,直到程序结束甘休
协调写了个小例子,想在页面每隔一秒输出二个数字。

<?php
for ($i=10; $i>0; $i–)
{
echo $i;
flush();
sleep(1);
}
?>
依据php手册里的传教
该函数将日前得了程序的有所出口发送到用户的浏览器。
地点的这段代码,应该隔一分钟输出一遍$i。不过实际中却不必然是如此。有极大可能率是等了10分钟后,全体的输出相同的时间显现出来。
好,大家来改一下这段代码,改成
<?php
ob_end_clean();//修改部分
for ($i=10; $i>0; $i–)
{
echo $i;
flush();
sleep(1);
}
?>
嗬,加了这一句ob_end_clean();,居然就OK了。实际上,我们把ob_end_clean()换成ob_end_flush()也一样OK。
作者再来改一改。
<?php
for ($i=10; $i>0; $i–)
{
echo $i;
ob_flush();//修改部分
flush();
sleep(1);
}
?>
运作一下,是或不是意识$i也隔一秒输出一回了?那是干什么呢?
别急,大家来会见php.ini。
打开php.ini,搜索output_buffering,我们拜会到类似那样的装置
output_buffering =
4096。正如它的名字output_buffering同样,那几个装置的法力正是把出口缓冲一下,缓冲大小为4096bytes.
在我们的率先段代码里,之所以未有按预想的输出,正是因为那么些output_buffering把这个输出都缓冲了。没达到4096bytes大概脚本截止,输出是不会被发送出去的。
而第二段代码中的ob_end_clean()和ob_end_flush()的功力,就是停止缓冲。那样就不用等到有4096bytes的缓冲之后才被发送出去了。
其三段代码中,用了一句ob_flush(),它的职能便是把缓冲的数额发送出去,可是并不会停下缓冲,所以它必须在历次flush()前使用。
假若不想使用ob_end_clean(),ob_end_flush()和ob_flush(),大家就无法不把php.ini里的
output_buffering设得丰裕小,比如设为0。要求小心的是,纵然你图谋在本子中选取ini_set(”
output_buffering”,”0″)来安装,那么请停下来呢,这种艺术是拾壹分的。因为在剧本一初始的时候,缓冲设置就曾经被载入,然后缓冲就从头了。
或然您会问了,既然ob_flush()是把缓冲的数量发送出去,那么为啥还亟需用flush()???直接用下边这段代码欠行吗??
<?php
for ($i=10; $i>0; $i–)
{
echo $i;
ob_flush();
sleep(1);
}
?>
请注意ob_flush()和flush()的界别。后面一个是把数量从PHP的缓冲中释放出来,前面一个是把不在缓冲中的或然说是被释放出来的数量发送到浏览器。所以当缓冲存在的时候,我们亟须ob_flush()和flush()同一时候利用。
那是或不是flush()在此处正是不行缺失的呢?不是的,大家还大概有别的一种格局,使妥当有数据输出的时候,立时被发送到浏览器。上面这两段代码正是无需动用flush()了。(当您把output_buffering设为0的时候,连ob_flush()和ob_end_clean()都无需了)
<?php
ob_implicit_flush(true);
for ($i=10; $i>0; $i–)
{
echo $i;
ob_flush();
sleep(1);
}
?>
<?php
ob_end_clean();
ob_implicit_flush(true);
for ($i=10; $i>0; $i–)
{
echo $i;
sleep(1);
}
?>
请稳重看下面的ob_implicit_flush(true),那些函数强制每当有出口的时候,立刻把出口发送到浏览器。那样就不须求每回输出(echo)后,都用flush()来发送到浏览器了。
以上所诉或然在少数浏览器中不创制。因为浏览器也许有投机的条条框框。小编是用Firefox1.5,IE6,opera8.5来测量检验的。在那之中opera就不可能寻常输出,因为它有二个准绳,便是不遭受二个HTML标签,就相对不出口,除非到脚本甘休。而FireFox和IE还算相比较平常的。
最后附上一段非常风趣的代码,小编为PuTTYshell。在多少个剧本周期里,每回输出,都会把前一遍的输出覆盖掉。
以下代码只在firefox下可用,其余浏览器并不支持multipart/x-mixed-replace的Content-Type.
<?php
header(‘Content-type:
multipart/x-mixed-replace;boundary=endofsection’);
print “\n–endofsection\n”;
$pmt = array(“-“, “\\”, “|”, “/” );
for( $i = 0; $i <10; $i ++ ){
sleep(1);
print “Content-type: text/plain\n\n”;
print “Part $i\t”.$pmt[$i % 4];
print “–endofsection\n”;
ob_flush();
flush();
}
print “Content-type: text/plain\n\n”;
print “The end\n”;
print “–endofsection–\n”;
?>

根据英特网的代码:

你恐怕感兴趣的作品:

复制代码 代码如下:

ob_end_clean();
for ($i=10; $i>0; $i–)
{
echo $i;
flush();
sleep(1);
}

或者:

复制代码 代码如下:

for ($i=10; $i>0; $i–)
{
echo $i;
ob_flush();
flush();
sleep(1);
}

本身开采在火狐里面生效,但在IE里不起成效,每一回都以10个数字一同输出,那注脚缓冲未有奏效。

小编又起来调解php.ini里面包车型地铁output_buffering的装置,重启apache,仍然不济。

下一场自个儿看齐了一段话:

部分版本的 Microsoft Internet Explorer
唯有当接受到的257个字节今后才开头突显该页面,所以必须发送一些附加的空格来让这么些浏览器显示页面内容。

罪恶的IE浏览器,难题就是TMD的多!

然后作者修改了下程序,便平常了:

复制代码 代码如下:

echo str_pad(”,4096);
for ($i = 0; $i < 10; $i++) {
echo $i;
ob_flush();
flush();
sleep(1);
}

复制代码 代码如下:

//ob_end_flush();//IE8下没起作用
echo str_pad(” “, 256);//IE需求承受到2伍十五个字节之后才早先体现

for($i=0;$i<18;$i++) {
echo $i;
flush();
sleep(1);
}

你或然感兴趣的篇章:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图