国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 編程 > PHP > 正文

最詳細的PHP flush()與ob_flush()的區(qū)別詳解

2020-03-22 20:09:35
字體:
供稿:網(wǎng)友
  • buffer ---- flush()

    buffer是一個內(nèi)存地址空間,html' target='_blank'>Linux系統(tǒng)默認大小一般為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傳給瀏覽器顯示。所以,數(shù)據(jù)會依次寫到這幾個地方echo/print -> php buffer -> tcp buffer -> browser

    php output_buffering --- ob_flush()

    默認情況下,php buffer是開啟的,而且該buffer默認值是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(),客戶端才能立即獲得腳本的輸出。

    一. flush和ob_flush的正確順序,正確應(yīng)是,先ob_flush再flush,如下:
    ob_flush();
    flush();
    如果Web服務(wù)器的操作系統(tǒng)是windows系統(tǒng),那順序顛倒或者不使用ob_flush()也不會出現(xiàn)問題。[有待求證] 但是在Linux系統(tǒng)上就無法刷新輸出緩沖。

    output buffering函數(shù)
    1.bool ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] )
    激活output_buffering機制。一旦激活,腳本輸出不再直接出給瀏覽器,而是先暫時寫入php buffer內(nèi)存區(qū)域。
    php默認開啟output_buffering機制,只不過,通過調(diào)用ob_start()函數(shù)據(jù)output_buffering值擴展到足夠 大 。也可以指定$chunk_size來指定output_buffering的值。$chunk_size默認值是0,表示直到腳本運行結(jié)束,php buffer中的數(shù)據(jù)才會發(fā)送到瀏覽器。如果你設(shè)置了$chunk_size的大小 ,則表示只要buffer中數(shù)據(jù)長度達到了該值,就會將buffer中 的數(shù)據(jù)發(fā)送給瀏覽器。
    當(dāng)然,你可以通過指定$ouput_callback,來處理buffer中的數(shù)據(jù)。比如函數(shù)ob_gzhandler,將buffer中的數(shù)據(jù)壓縮后再傳送給瀏覽器。
    第三個參數(shù):是否擦除緩存,可選,默認是true,如果設(shè)置為false,則在腳本執(zhí)行結(jié)束前,緩存都不會被清除。
    2.ob_get_contents
    獲取一份php buffer中的數(shù)據(jù)拷貝。值得注意的是,你應(yīng)該在ob_end_clean()函數(shù)調(diào)用前調(diào)用該函數(shù),否則ob_get_contents()返回一個空字符中。

    可以使用ob_get_contents()以字符串形式獲取服務(wù)端緩存的數(shù)據(jù),
    使用ob_end_flush()則會輸出被緩存起來的數(shù)據(jù),并關(guān)閉緩存。
    而使用ob_end_clean()則會靜默的清除服務(wù)端緩存的數(shù)據(jù),而不會有任何數(shù)據(jù)或其他行為。
    服務(wù)端的緩存是堆疊起來的,也就是說你在開啟了ob_start()后,關(guān)閉之前,在其內(nèi)部還 可以開啟另外一個緩存ob_start()。

    不過你也要務(wù)必保證關(guān)閉緩存的操作和開啟緩存的操作數(shù)量一樣多。
    ob_start() 可以指定一個回調(diào)函數(shù)來處理緩存數(shù)據(jù),如果一個ob_start()內(nèi)部嵌套了另一個ob_start(),我們假定,外層的ob_start(),編號是A,內(nèi)層的ob_start()編號是B,它們各自制定了一個回調(diào)函數(shù)分別是functionA和functionB,那么在緩存B中的數(shù)據(jù)輸出時,它會先輩f(xié)uncitonB回調(diào)函數(shù)處理,再交給外層的functionA回調(diào)函數(shù)處理,之后才能輸出到客戶端。

    另外,手冊說,對于某些web服務(wù)器,比如apache,在使用回調(diào)函數(shù)有可能會改變程序當(dāng)前的工作目錄,解決方法是在回調(diào)函數(shù)中自行手動把工作目錄修改回來,用chdir函數(shù),這點似乎不常遇到,遇到的時候記得去查手冊吧。

    3.ob_end_flush與ob_end_clean
    這二個函數(shù)有點相似,都會關(guān)閉ouptu_buffering機制。但不同的是,ob_end_flush只是把php buffer中的數(shù)據(jù)沖(flush/send)到客戶端瀏覽器,而ob_clean_clean將php bufeer中的數(shù)據(jù)清空(erase),但不發(fā)送給客戶端瀏覽器。

    ob_end_flush調(diào)用之前,php buffer中的數(shù)據(jù)依然存在,ob_get_contents()依然可以獲取php buffer中的數(shù)據(jù)拷貝。

    而ob_end_flush()調(diào)用之后ob_get_contents()取到的是空字符串,同時瀏覽器也接收不到輸出,即沒有任何輸出。

    可以使用ob_get_contents()以字符串形式獲取服務(wù)端緩存的數(shù)據(jù),使用ob_end_flush()則會輸出被緩存起來的數(shù)據(jù),并關(guān)閉緩存。
    而使用ob_end_clean()則會靜默的清除服務(wù)端緩存的數(shù)據(jù),而不會有任何數(shù)據(jù)或其他行為。
    服務(wù)端的緩存是堆疊起來的,也就是說你在開啟了ob_start()后,關(guān)閉之前,在其內(nèi)部還可以開啟另外一個緩存ob_start()。不過你也要務(wù)必保證關(guān)閉緩存的操作和開啟緩存的操作數(shù)量一樣多。
    ob_start() 可以指定一個回調(diào)函數(shù)來處理緩存數(shù)據(jù),如果一個ob_start()內(nèi)部嵌套了另一個ob_start(),我們假定,外層的ob_start(),編號是A,內(nèi)層的ob_start()編號是B,它們各自制定了一個回調(diào)函數(shù)分別是functionA和functionB,那么在緩存B中的數(shù)據(jù)輸出時,它會先輩f(xié)uncitonB回調(diào)函數(shù)處理,再交給外層的functionA回調(diào)函數(shù)處理,之后才能輸出到客戶端。

    另外,手冊說,對于某些web服務(wù)器,比如apache,在使用回調(diào)函數(shù)有可能會改變程序當(dāng)前的工作目錄,解決方法是在回調(diào)函數(shù)中自行手動把工作目錄修改回來,用chdir函數(shù),這點似乎不常遇到,遇到的時候記得去查手冊吧。

    PHP編程

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

  • 發(fā)表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發(fā)表
    国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
    99福利在线| eeuss影院www在线播放| 国产一区在线视频观看| 免费一区二区在线观看| 国产中文字幕在线观看| 天天操天天射天天插| 国产系列在线观看| 国产高清视频在线观看| 亚洲成a人v欧美综合天堂麻豆| 永久免费在线观看| 福利视频在线看| 午夜av电影| 国产精品久久人| 亚洲第一成年免费网站| 国产毛片在线看| 91久久精品国产性色| 国产精品视频福利一区二区| 精品一二三四| 国产美女在线看| 91高清国产| 天堂在线免费av| 国产网友自拍电影在线| 国产精品久久久久久久牛牛| gogogogo高清视频在线| 国产网友自拍电影在线 | 国产一起色一起爱| 在线观看中文字幕的网站| 天堂资源中文在线| 9色在线视频网站| 丁香花在线电影小说观看| 在线观看免费观看在线91| 成在线人视频免费视频| av免费在线观看网站| 国产精品伦理一区二区三区| 久久91精品视频| 亚洲成av人影片在线观看 | 午夜av在线播放| 久久国产综合视频| 亚洲an天堂an在线观看| 精品一二三四| 91精品专区| 精品麻豆视频| 国产视频福利在线| 中文字幕不卡| 国产欧美一区二区三区小说| 国产无套粉嫩白浆在线2022年| 丁香视频五月| 国产精品天堂| 国产免费黄网站| 91福利在线免费| 黄色av网址在线免费观看| eeuss影院www在线播放| 亚洲欧美日韩成人网| 在线观看的av| 青青草视频免费在线观看| 日本不卡影院| 国产免费福利| 国产精品免费视频二三区| 国产一区二区三区不卡免费观看 | 狠狠综合久久久综合| 高清av中文在线字幕观看1| 九九视频在线播放| 国产一卡2卡3卡四卡网站| 69视频在线观看| 狠狠干五月天| 国产精品黄页网站在线播放免费 | 亚洲私人影吧| 欧美日韩一区二区三区在线播放 | 亚洲国产成人综合| 久久精品蜜桃| 精品国产一区二区三区不卡在线 | 青青久草在线| 自拍亚洲国产| 亚洲an天堂an在线观看| 国产美女在线一区二区三区| 尤物免费看在线视频| 精品久久九九| 五月婷婷在线观看| v天堂福利视频在线观看| 国产精品免费视频一区一| 久草亚洲一区| gogo在线观看| 91中文字幕| 午夜免费福利在线观看| 欧美日韩一区二区三区视视频| 1区2区3区在线| 国产在线看片| a级片国产精品自在拍在线播放| 国产精品久久一区二区三区不卡| 日韩欧美中文字幕不卡| 国产丝袜自拍| 国产一级网站视频在线| 九九在线免费视频| a视频在线观看| wwww亚洲| 波多野结衣久久高清免费| 伊人狠狠av| 在线中文资源天堂| 国产国语**毛片高清视频| 国产亚洲精品午夜高清影院| 黄色网页网址在线免费| 青娱乐在线视频观看| 日本三级在线视频| a视频在线看| 天堂中文在线观看| 一本免费视频| av在线不卡免费| 啪啪免费视频一区| 免费看的毛片| 91xxx在线观看| 国产精品合集一区二区| 91www在线观看| 夜夜爽夜夜操| 成年网在线观看免费观看网址| wwww在线观看| 午夜av电影| 99综合精品久久| 日本电影全部在线观看网站视频| 四虎久久影院| 国产免费一级片| 最近免费中文字幕大全免费第三页 | 2018av男人天堂| 2018中文字幕在线观看| 一级二级三级在线观看| 国产在线观看网站| 国产福利片在线| 超碰免费在线观看| 中文字幕一区免费| 日本啊v在线| 91xx在线观看| 福利视频在线导航| 亚洲精品天堂在线观看| 国产一卡2卡3卡4卡网站免费| 国产欧美在线观看视频| 欧美日韩**字幕一区| 国产精品爱久久久久久久小说| 日本三级在线视频| 国产无遮挡在线视频免费观看| 在线免费看av| 综合图区亚洲白拍在线| jizz国产| 99热免费在线观看| 国产毛片视频| 青青九九免费视频在线| 国产福利图片| 国产激情自拍视频| 国产麻豆视频| 久草国产视频| 99re6在线视频精品免费| 日本综合一区二区三区| 国产福利热线视频| 国产亚洲精品久久久久久移动网络| 精品视频一区二区观看| 中文字幕在线免费观看| 国产免费永久在线观看| 美女免费视频黄| 午夜在线视频| 天天操夜夜做| 四虎国产精品永久在线| 在线国产小视频| 亚洲成人av高清| gogo在线高清视频| 黄色网址在线免费播放| 91最新在线| 亚洲男人网站| 思思99精品视频在线观看| 亚洲大香人伊一本线| 亚洲sss视频| 欧美国产中文| 黄色av免费看| 最好2018中文免费视频| 中文字幕在线观看日本| 天堂资源在线中文| 国产精品99999| 精精国产xxxx视频在线| 国产精品视频h| 国产aa视频| 欧美一级久久久久久久久大| 91极品在线| 日本免费视频www| 免费日本黄色| 最新国产在线精品91尤物| 国产精品视频福利一区二区 | 国产一级粉嫩xxxx| 中文字幕毛片| 亚洲天堂视频在线观看免费| 久久精品视频观看| 国产精品久久久高清免费| 在线观看免费观看在线91| www.狠狠操.com| 二区三区中文字幕| 国产青青草在线| 国产福利视频在线观看| 91嫩草在线播放| 亚洲欧美日韩成人网| 女同一区二区免费aⅴ| 国产欧美在线观看视频| 亚洲精品手机在线| 中文字幕国产欧美| 日韩黄色成人|