關(guān)于PHP的flush和ob_flush的機制測試

php正常的一個輸出過高需要經(jīng)歷的階段:
echo/print -> php buffer -> tcp buffer -> browser

一,buffer ---- flush()

buffer是一個內(nèi)存地址空間,Linux系統(tǒng)默認(rèn)大小一般為4096(1kb),即一個內(nèi)存頁乞巧。主要用于存儲速度不同步的設(shè)備或者優(yōu)先級不同的 設(shè)備之間傳辦理數(shù)據(jù)的區(qū)域。通過buffer摊鸡,可以使進程這間的相互等待變少绽媒。這里說一個通俗一點的例子,你打開文本編輯器編輯一個文件的時候免猾,你每輸入 一個字符是辕,操作系統(tǒng)并不會立即把這個字符直接寫入到磁盤,而是先寫入到buffer猎提,當(dāng)寫滿了一個buffer的時候获三,才會把buffer中的數(shù)據(jù)寫入磁 盤,當(dāng)然當(dāng)調(diào)用內(nèi)核函數(shù)flush()的時候,強制要求把buffer中的臟數(shù)據(jù)寫回磁盤疙教。
同樣的道理棺聊,當(dāng)執(zhí)行echo,print的時候,輸出并沒有立即通過tcp傳給客戶端瀏覽器顯示, 而是將數(shù)據(jù)寫入php buffer贞谓。php output_buffering機制限佩,意味在tcp buffer之前,建立了一新的隊列裸弦,數(shù)據(jù)必須經(jīng)過該隊列祟同。當(dāng)一個php buffer寫滿的時候,腳本進程會將php buffer中的輸出數(shù)據(jù)交給系統(tǒng)內(nèi)核交由tcp傳給瀏覽器顯示烁兰。

二耐亏,php output_buffering --- ob_flush()

默認(rèn)情況下,php buffer是開啟的沪斟,而且該buffer默認(rèn)值是4096广辰,即1kb。你可以通過在php.ini配置文件中找到output_buffering配置.當(dāng)echo,print等輸出用戶數(shù)據(jù)的時候主之,輸出數(shù)據(jù)都會寫入到php output_buffering中择吊,直到output_buffering寫滿,會將這些數(shù)據(jù)通過tcp傳送給瀏覽器顯示槽奕。你也可以通過 ob_start()手動激活php output_buffering機制几睛,使得即便輸出超過了1kb數(shù)據(jù),也不真的把數(shù)據(jù)交給tcp傳給瀏覽器粤攒,因為ob_start()將php buffer空間設(shè)置到了足夠大 所森。只有直到腳本結(jié)束,或者調(diào)用ob_end_flush函數(shù)夯接,才會把數(shù)據(jù)發(fā)送給客戶端瀏覽器焕济。

這兩個函數(shù)的使用怕是很多人最迷惑的一個問題,手冊上對兩個函數(shù)的解釋也語焉不詳盔几,沒有明確的指出它們的區(qū)別晴弃,似乎二者的功能都是刷新輸出緩存。但在我們文章一開始的代碼中如果講fush()替換成ob_flush()逊拍,程序就再不能正確執(zhí)行了上鞠。顯然,它們是有區(qū)別的芯丧,否則也手冊中直接說明其中一個是另外一個函數(shù)的別名即可了芍阎,沒必要分別說明。那么它們的區(qū)別到底是什么呢缨恒?

在沒有開啟緩存時谴咸,腳本輸出的內(nèi)容都在服務(wù)器端處于等待輸出的狀態(tài) 度硝,flush()可以將等待輸出的內(nèi)容立即發(fā)送到客戶端。

開啟緩存后寿冕,腳本輸出的內(nèi)容存入了輸出緩存中 ,這時沒有處于等待輸出狀態(tài)的內(nèi)容椒袍,你直接使用flush()不會向客戶端發(fā)出任何內(nèi)容驼唱。而 ob_flush()的作用就是將本來存在輸出緩存中的內(nèi)容取出來,設(shè)置為等待輸出狀態(tài)驹暑,但不會直接發(fā)送到客戶端 玫恳,這時你就需要先使用 ob_flush()再使用flush(),客戶端才能立即獲得腳本的輸出优俘。

三京办,測試
3.1,output_buffering=4096帆焕,輸出較少的數(shù)據(jù)(少于一個buffer)

<?php
for($i=0; $i<10; $i++){
    echo $i.'<br>';
    sleep(1);
}
運行結(jié)果:等所有腳本全部運行完成后惭婿,才輸出,因為數(shù)據(jù)未滿一個buffer的大小叶雹。

3.2.output_buffering=4096财饥,輸出較少的數(shù)據(jù)(少于一個buffer),關(guān)閉output_buffering折晦,修改php.ini的output_buffering=0

<?php
for($i=0; $i<10; $i++){
    echo $i.str_repeat("&nbsp;",1000).'<br>'; // 為了瀏覽器能夠顯示
    flush();
    sleep(1);
}
運行結(jié)果:因為禁用了php buffering钥星,不需要等到腳本運行完畢就可以輸出,數(shù)據(jù)沒有在php buffer停留满着,可以看到斷斷續(xù)續(xù)間歇性輸出谦炒。echo -> tcp buffer ->browser

參考博文:
https://blog.csdn.net/fdipzone/article/details/10367837
http://www.laruence.com/2010/04/15/1414.html
https://www.cnblogs.com/zhangyuhang3/p/6873502.html
http://niliu.me/articles/605.html#comment-2983

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市风喇,隨后出現(xiàn)的幾起案子宁改,更是在濱河造成了極大的恐慌,老刑警劉巖响驴,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件透且,死亡現(xiàn)場離奇詭異,居然都是意外死亡豁鲤,警方通過查閱死者的電腦和手機秽誊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來琳骡,“玉大人锅论,你說我怎么就攤上這事¢购牛” “怎么了最易?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵怒坯,是天一觀的道長。 經(jīng)常有香客問我藻懒,道長剔猿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任嬉荆,我火速辦了婚禮归敬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鄙早。我一直安慰自己汪茧,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布限番。 她就那樣靜靜地躺著舱污,像睡著了一般。 火紅的嫁衣襯著肌膚如雪弥虐。 梳的紋絲不亂的頭發(fā)上扩灯,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機與錄音躯舔,去河邊找鬼驴剔。 笑死,一個胖子當(dāng)著我的面吹牛粥庄,可吹牛的內(nèi)容都是我干的丧失。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼惜互,長吁一口氣:“原來是場噩夢啊……” “哼布讹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起训堆,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤描验,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后坑鱼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體膘流,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年鲁沥,在試婚紗的時候發(fā)現(xiàn)自己被綠了呼股。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡画恰,死狀恐怖彭谁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情允扇,我是刑警寧澤缠局,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布则奥,位于F島的核電站,受9級特大地震影響狭园,放射性物質(zhì)發(fā)生泄漏读处。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一唱矛、第九天 我趴在偏房一處隱蔽的房頂上張望档泽。 院中可真熱鬧,春花似錦揖赴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至阿逃,卻和暖如春铭拧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背恃锉。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工搀菩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人破托。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓肪跋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親土砂。 傳聞我的和親對象是個殘疾皇子州既,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容

  • buffer是一個內(nèi)存地址空間,linux系統(tǒng)默認(rèn)大小一般為4096(4kb)萝映。主要用于存儲速度不同步的設(shè)備或優(yōu)先...
    金星show閱讀 5,849評論 0 1
  • PHP的輸出緩沖區(qū) 什么是緩沖區(qū)?簡單而言,緩沖區(qū)的作用就是,把輸入或者輸出的內(nèi)容先放進內(nèi)存,而不顯示或者讀取.至...
    桖辶殤閱讀 2,017評論 3 12
  • flush()、ob_flush()奥秆、ob_end_flush()三者的區(qū)別: 首先逊彭,說下buffer它是一個內(nèi)存...
    盤木閱讀 1,208評論 0 1
  • ob的基本原則:如果ob緩存打開,則echo的數(shù)據(jù)首先放在ob緩存吭练。如果是header信息诫龙,直接放在程序緩存。當(dāng)頁...
    金星show閱讀 995評論 0 1
  • 更改ip和dnsVi /etc/sysconfig/network-scripts/ifcfg-eth0vi /...
    Xwei_閱讀 1,804評論 0 3