天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

php flush類輸出緩沖剖析

<?php
for ($i=10; $i>0; $i--)
{
echo $i;
flush();
sleep(1);
}
?>
按照php手冊里的說法
該函數(shù)將當前為止程序的所有輸出發(fā)送到用戶的瀏覽器。
上面的這段代碼,應(yīng)該隔一秒鐘輸出一次$i。但是實際中卻不一定是這樣。有可能是等了10秒鐘后,所有的輸出同時呈現(xiàn)出來。
好,我們來改一下這段代碼,改成
<?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);
}
?>
運行一下,是不是發(fā)現(xiàn)$i也隔一秒輸出一次了?這是為什么呢?
別急,我們來看看php.ini。
打開php.ini,搜索output_buffering,我們會看到類似這樣的設(shè)置 output_buffering = 4096。正如它的名字output_buffering一樣,這個設(shè)置的作用就是把輸出緩沖一下,緩沖大小為4096bytes.
在我們的第一段代碼里,之所以沒有按預期的輸出,正是因為這個output_buffering把那些輸出都緩沖了。沒達到4096bytes或者腳本結(jié)束,輸出是不會被發(fā)送出去的。
而第二段代碼中的ob_end_clean()和ob_end_flush()的作用,就是終止緩沖。這樣就不用等到有4096bytes的緩沖之后才被發(fā)送出去了。
第三段代碼中,用了一句ob_flush(),它的作用就是把緩沖的數(shù)據(jù)發(fā)送出去,但是并不會終止緩沖,所以它必須在每次flush()前使用。
如果不想使用ob_end_clean(),ob_end_flush()和ob_flush(),我們就必須把php.ini里的 output_buffering設(shè)得足夠小,例如設(shè)為0。需要注意的是,如果你打算在腳本中使用ini_set(” output_buffering”,”0″)來設(shè)置,那么請停下來吧,這種方法是不行的。因為在腳本一開始的時候,緩沖設(shè)置就已經(jīng)被載入,然后緩沖就開始了。
可能你會問了,既然ob_flush()是把緩沖的數(shù)據(jù)發(fā)送出去,那么為什么還需要用flush()???直接用下面這段代碼不行嗎??
<?php
for ($i=10; $i>0; $i--)
{
echo $i;
ob_flush();
sleep(1);
}
?>
請注意ob_flush()和flush()的區(qū)別。前者是把數(shù)據(jù)從php的緩沖中釋放出來,后者是把不在緩沖中的或者說是被釋放出來的數(shù)據(jù)發(fā)送到瀏覽器。所以當緩沖存在的時候,我們必須ob_flush()和flush()同時使用。
那是不是flush()在這里就是不可缺少的呢?不是的,我們還有另外一種方法,使得當有數(shù)據(jù)輸出的時候,馬上被發(fā)送到瀏覽器。下面這兩段代碼就是不需要使用flush()了。(當你把output_buffering設(shè)為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),這個函數(shù)強制每當有輸出的時候,即刻把輸出發(fā)送到瀏覽器。這樣就不需要每次輸出(echo)后,都用flush()來發(fā)送到瀏覽器了。
以上所訴可能在某些瀏覽器中不成立。因為瀏覽器也有自己的規(guī)則。我是用Firefox1.5,IE6,opera8.5來測試的。其中opera就不能正常輸出,因為它有一個規(guī)則,就是不遇到一個HTML標簽,就絕對不輸出,除非到腳本結(jié)束。而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("-", "http://", "|", "/" );
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";
?>

php技術(shù)php flush類輸出緩沖剖析,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 成人国产精品玖玖热色欲 | 国产成人免费全部网站 | 人妻熟妇乱又伦精品视频中文字幕 | 亚色九九九全国免费视频 | 一级毛片皇帝 宫女 | 伊人久久精品99热超碰 | 动漫美女被h动态图 | 黑人性xxx| 欧美精品九九99久久在免费线 | 娇妻归来在线观看免费完整版电影 | 国产成人久久AV免费看澳门 | 久久国产精品无码视欧美 | 久久免费国产 | 久久久无码AV精品亚洲A片软件 | 亚洲国产精品自在自线观看 | adc免费观看 | 中文在线观看 | 公和我做好爽添厨房中文字幕 | 99精品国产在热久久 | 日本高清片免费观看 | 同时被两个男人轮流舔 | 国产午夜精品美女免费大片 | 九九热这里只有国产精品 | 在线一本码道高清 | 被男按摩师添的好爽在线直播 | ping色堂| 精品蜜臀AV在线天堂 | 99久久国语露脸精品国产 | 亚州免费一级毛片 | 欧美丰满少妇久久无码精品 | 日本50人群体交乱 | 日韩欧美视频一区二区在线观看 | 国产在线视频一区二区不卡 | 影音先锋av男人资源 | 久久这里只有精品国产精品99 | 伊人久久大香线蕉avapp下载 | 国产日韩欧美三级 | 婷婷久久综合九色综合伊人色 | 视频一区亚洲中文字幕 | 美女张开腿让我了一夜 | 免费看 a一级毛片 免费久久狼人香蕉网 |