麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 編程 > PHP > 正文

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

2020-03-22 20:09:35
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
  • buffer ---- flush()

    buffer是一個(gè)內(nèi)存地址空間,html' target='_blank'>Linux系統(tǒng)默認(rèn)大小一般為4096(1kb),即一個(gè)內(nèi)存頁(yè)。主要用于存儲(chǔ)速度不同步的設(shè)備或者優(yōu)先級(jí)不同的 設(shè)備之間傳辦理數(shù)據(jù)的區(qū)域。通過(guò)buffer,可以使進(jìn)程這間的相互等待變少。這里說(shuō)一個(gè)通俗一點(diǎn)的例子,你打開(kāi)文本編輯器編輯一個(gè)文件的時(shí)候,你每輸入 一個(gè)字符,操作系統(tǒng)并不會(huì)立即把這個(gè)字符直接寫(xiě)入到磁盤(pán),而是先寫(xiě)入到buffer,當(dāng)寫(xiě)滿了一個(gè)buffer的時(shí)候,才會(huì)把buffer中的數(shù)據(jù)寫(xiě)入磁 盤(pán),當(dāng)然當(dāng)調(diào)用內(nèi)核函數(shù)flush()的時(shí)候,強(qiáng)制要求把buffer中的臟數(shù)據(jù)寫(xiě)回磁盤(pán)。
    同樣的道理,當(dāng)執(zhí)行echo,print的時(shí)候,輸出并沒(méi)有立即通過(guò)tcp傳給客戶端瀏覽器顯示, 而是將數(shù)據(jù)寫(xiě)入php buffer。php output_buffering機(jī)制,意味在tcp buffer之前,建立了一新的隊(duì)列,數(shù)據(jù)必須經(jīng)過(guò)該隊(duì)列。當(dāng)一個(gè)php buffer寫(xiě)滿的時(shí)候,腳本進(jìn)程會(huì)將php buffer中的輸出數(shù)據(jù)交給系統(tǒng)內(nèi)核交由tcp傳給瀏覽器顯示。所以,數(shù)據(jù)會(huì)依次寫(xiě)到這幾個(gè)地方echo/print -> php buffer -> tcp buffer -> browser

    php output_buffering --- ob_flush()

    默認(rèn)情況下,php buffer是開(kāi)啟的,而且該buffer默認(rèn)值是4096,即1kb。你可以通過(guò)在php.ini配置文件中找到output_buffering配置.當(dāng)echo,print等輸出用戶數(shù)據(jù)的時(shí)候,輸出數(shù)據(jù)都會(huì)寫(xiě)入到php output_buffering中,直到output_buffering寫(xiě)滿,會(huì)將這些數(shù)據(jù)通過(guò)tcp傳送給瀏覽器顯示。你也可以通過(guò) ob_start()手動(dòng)激活php output_buffering機(jī)制,使得即便輸出超過(guò)了1kb數(shù)據(jù),也不真的把數(shù)據(jù)交給tcp傳給瀏覽器,因?yàn)閛b_start()將php buffer空間設(shè)置到了足夠大。只有直到腳本結(jié)束,或者調(diào)用ob_end_flush函數(shù),才會(huì)把數(shù)據(jù)發(fā)送給客戶端瀏覽器。

    這兩個(gè)函數(shù)的使用怕是很多人最迷惑的一個(gè)問(wèn)題,手冊(cè)上對(duì)兩個(gè)函數(shù)的解釋也語(yǔ)焉不詳,沒(méi)有明確的指出它們的區(qū)別,似乎二者的功能都是刷新輸出緩存。但在我們文章一開(kāi)始的代碼中如果講fush()替換成ob_flush(),程序就再不能正確執(zhí)行了。顯然,它們是有區(qū)別的,否則也手冊(cè)中直接說(shuō)明其中一個(gè)是另外一個(gè)函數(shù)的別名即可了,沒(méi)必要分別說(shuō)明。那么它們的區(qū)別到底是什么呢?

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

    開(kāi)啟緩存后,腳本輸出的內(nèi)容存入了輸出緩存中,這時(shí)沒(méi)有處于等待輸出狀態(tài)的內(nèi)容,你直接使用flush()不會(huì)向客戶端發(fā)出任何內(nèi)容。而 ob_flush()的作用就是將本來(lái)存在輸出緩存中的內(nèi)容取出來(lái),設(shè)置為等待輸出狀態(tài),但不會(huì)直接發(fā)送到客戶端,這時(shí)你就需要先使用 ob_flush()再使用flush(),客戶端才能立即獲得腳本的輸出。

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

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

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

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

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

    3.ob_end_flush與ob_end_clean
    這二個(gè)函數(shù)有點(diǎn)相似,都會(huì)關(guān)閉ouptu_buffering機(jī)制。但不同的是,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()取到的是空字符串,同時(shí)瀏覽器也接收不到輸出,即沒(méi)有任何輸出。

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

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

    PHP編程

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

  • 發(fā)表評(píng)論 共有條評(píng)論
    用戶名: 密碼:
    驗(yàn)證碼: 匿名發(fā)表
    主站蜘蛛池模板: 美国av免费看| 精品一区二区久久久久久按摩 | 黄色毛片a级 | 国产免费美女 | 美国一级免费视频 | 精品久久久久久久久中文字幕 | 99国产精品自拍 | 日本中文不卡视频 | 羞羞答答影院 | 欧美成人se01短视频在线看 | 国产在线看一区 | 成人羞羞在线观看网站 | 久久久精品视频免费看 | 国产成人高清在线观看 | 亚洲视频精选 | 精品中文字幕在线播放 | 99国产精品国产免费观看 | 一本色道久久综合亚洲精品图片 | 国产伦精品一区二区三区在线 | 国产毛片在线高清视频 | 久久精品免费国产 | 中国女人内谢8xxxxxx在 | 久久日韩在线 | 伦一区二区三区中文字幕v亚洲 | 免费毛片免费看 | 国产高潮好爽受不了了夜色 | 日本在线播放一区二区三区 | 舌头伸进添的我好爽高潮网站 | 91精品国| av在线免费电影 | 中国fx性欧美xxxx | 性高湖久久久久久久久aaaaa | av在线更新 | 国产一区二区三区四区在线 | 亚洲精品久久久久久久久久 | 成人毛片免费看 | av在线浏览| 欧美五月婷婷 | 毛片视频观看 | 国产精品久久久久影院老司 | 精品一区二区视频在线观看 |