最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

php中ob函數(shù)緩沖機制深入理解

 更新時間:2015年08月03日 10:05:12   作者:DeanChopper  
這篇文章主要介紹了php中ob函數(shù)緩沖機制,有需要的小伙伴們可以來學習下

下面就php中ob函數(shù)緩沖機制通過文字說明加代碼分析的形式給大家展示如下:

對于一個剛剛?cè)腴T的php程序員來說,php緩沖區(qū)是幾乎透明的。在他們心目中,一個echo print_r 函數(shù),數(shù)據(jù)便會‘嗖'的一聲飛到瀏覽器上,顯示出來。我也一直如此單純地認為。 其實,在技術(shù)的世界里,向來都是由簡單到復(fù)雜,也許那些技術(shù)開發(fā)者開始單純?nèi)缒阄?,但是面對殘酷的現(xiàn)實,不得不調(diào)整策略,以期提高機器運行效率,最后想到了那些讓我們贊嘆的idea。

  說到緩沖,也就是buffer,這里必須要和緩存做一下比較,單純地比較定義是無意義的,莫不如看看它們做什么。緩存解決的是如何快速查找利用數(shù)據(jù),節(jié)省cpu消耗問題,而緩沖解決的是高速cpu與低速I/O設(shè)備不匹配的問題。

  再說下本文的另一個主角,ob函數(shù),ob是output_buffering的簡寫。既然ob函數(shù)是php擴展函數(shù),那么ob函數(shù)主要操作的也就是php buffer了。

  簡單說完本文兩個主角,我們還必須回歸開頭的主題,echo print_r函數(shù)輸出的數(shù)據(jù)是怎么到達瀏覽器讓用戶看到的呢?實際上的歷程是這樣的:

復(fù)制代碼 代碼如下:

echo、print_r=>php output_buffering=>webServer buffer=>browser buffer=>browser display

  我們可以清楚地看到,從echo、print_r函數(shù)到發(fā)送信息給客戶端經(jīng)歷了兩個緩沖區(qū),在客戶端還經(jīng)歷了一個瀏覽器緩沖區(qū)。我們本文主要討論的是php output_buffering

  未使用ob函數(shù)時緩沖區(qū)的使用情況

   我們的代碼很多時候是根本不使用ob函數(shù)的,那么它們使用緩沖區(qū)了嗎?這要看php設(shè)置情況。緩沖區(qū)是通過php.ini中的output_buffering變量控制的。其默認值是off,可以設(shè)置為on來打開buffer。打來buffer后,即便程序中沒有用ob函數(shù),實際上代碼也是使用了緩沖區(qū)的。另外,不管php.ini中output_buffering的設(shè)置,cli模式下的php始終默認是關(guān)閉的。

  為什么要是緩沖區(qū)呢?簡單來說,高速的cpu早早處理完自己的數(shù)據(jù),想通過線路傳遞給用戶,但是線路太窄了,一下輸送不過去。如果引入緩沖區(qū),cpu可以將快速將生成的數(shù)據(jù)放入緩沖區(qū),然后自己哪兒涼快兒哪兒呆著這歇著去了。緩沖區(qū)根據(jù)指令適時將數(shù)據(jù)輸出。這個樣就合理解決了高速cpu與低速I/O設(shè)備的矛盾了。 

  緩沖區(qū)的數(shù)據(jù)什么時候輸出呢?1,當緩沖區(qū)滿了的時候,緩沖是有容量大小的,到達極限則會自動輸出內(nèi)容。2,腳本執(zhí)行完畢。很多小程序輸出內(nèi)容沒那么多,總不能等到緩沖區(qū)滿了再輸出吧~這一點再自然不過。

  使用ob函數(shù)時緩沖區(qū)的使用情況

復(fù)制代碼 代碼如下:

 ob_start()

  打開輸出緩沖。這個函數(shù)是我們調(diào)用最多的一個函數(shù)之一。在output_buffering設(shè)置為on或者x k的情況下,這個函數(shù)與其說是打開輸出緩沖,還不如說將輸出緩沖擴充到很大。當然在output_buffering設(shè)置為off的條件下,ob_start會起到打開buffer的作用。ob_start()還可以傳遞一個可選參數(shù) output_callback 函數(shù),php官方手冊有詳細說明。

復(fù)制代碼 代碼如下:

ob_get_contents()

  只是得到輸出緩沖區(qū)的內(nèi)容,但不清除它。

復(fù)制代碼 代碼如下:

ob_end_clean()與ob_clean()

  這兩個函數(shù)從字面意思上就可以看出其區(qū)別。前者清除緩沖區(qū)內(nèi)容并且關(guān)閉,后者僅僅是做清除工作。需要注意的是,使用了這兩個函數(shù),在前面使用了echo、print_r等函數(shù)不會輸出內(nèi)容。

  筆者曾經(jīng)試圖通過print_r打印出ob_get_contents()的內(nèi)容,然后調(diào)用ob_clean()清除緩沖區(qū),以免影響后面對緩沖區(qū)的操作,屢屢失敗。仔細想想,print_r的內(nèi)容再次寫入緩沖區(qū),而后面做了ob_clean()的操作,自然不會有任何輸出。在ob_clean操作之前調(diào)用ob_flush()函數(shù)便可達到預(yù)想的效果。

復(fù)制代碼 代碼如下:

ob_flush()與flush()

  ob_flush()送出緩沖區(qū)的內(nèi)容并且丟棄內(nèi)容。因而在此函數(shù)之前最好采用ob_get_contents()獲得緩沖區(qū)內(nèi)容。flush()刷出服務(wù)器端緩沖,并且發(fā)往客戶端。因而從流程上來說,應(yīng)該是先調(diào)用ob_flush()而后再調(diào)用flush函數(shù)。

  另外說明下再Apache buffer flush()的工作原理:在apache module的sapi下,flush會通過調(diào)用sapi_module()的flush成員函數(shù)指針,間接使用apache的api::ap_rflush刷新apache的輸出緩沖區(qū)。當然apache其他模塊比如mod_gzip可能改變這個動作的結(jié)果,可能自己進行輸出緩沖區(qū),這將導(dǎo)致flush()函數(shù)產(chǎn)生的結(jié)果不會立即被送到客戶端瀏覽器。

復(fù)制代碼 代碼如下:

ob_get_clean()

  如果你已經(jīng)熟練掌握ob_get_contents()ob_clean(),那這個函數(shù)就很簡單了。因為它是前兩者的結(jié)合體。它主要是得到當前緩沖區(qū)的內(nèi)容并刪除當前輸出緩沖區(qū)。

  ob函數(shù)還有很多,但大部分用法比較簡單,理解較為容易。大家可以參照php手冊 ,里面會有詳細的解釋。本文列出了筆者開始并不是很理解的一些函數(shù),當然今后還會有新的問題出現(xiàn),想到問題并且解決問題,生活的樂趣也許就在此處吧。

以上內(nèi)容就是本文針對php中ob函數(shù)緩沖機制深入理解,希望對大家今后學習有所幫助。

相關(guān)文章

  • Yii清理緩存的方法

    Yii清理緩存的方法

    這篇文章主要介紹了Yii清理緩存的方法,涉及Yii結(jié)合jQuery的ajax調(diào)用實現(xiàn)清理緩存功能,代碼簡單實用,需要的朋友可以參考下
    2016-01-01
  • php中PDO方式實現(xiàn)數(shù)據(jù)庫的增刪改查

    php中PDO方式實現(xiàn)數(shù)據(jù)庫的增刪改查

    PDO是mysql數(shù)據(jù)庫操作的一個公用類了,我們不需要進行自定類就可以直接使用pdo來操作數(shù)據(jù)庫了,但是在php默認配置中pdo是未開啟所以我們必須先在php.ini中開啟它才可以使用。
    2015-05-05
  • PHP laravel中的多對多關(guān)系實例詳解

    PHP laravel中的多對多關(guān)系實例詳解

    數(shù)據(jù)表之間是縱橫交叉、相互關(guān)聯(lián)的,laravel的一對一,一對多比較好理解,本文重點通過實例給大家講解 laravel中的多對多關(guān)系,感興趣的朋友一起看看吧
    2017-06-06
  • 布隆過濾器(bloom filter)及php和redis實現(xiàn)布隆過濾器的方法

    布隆過濾器(bloom filter)及php和redis實現(xiàn)布隆過濾器的方法

    這篇文章主要介紹了布隆過濾器(bloom filter)介紹以及php和redis實現(xiàn)布隆過濾器實現(xiàn)方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • php一鍵打包壓縮目錄文件示例代碼

    php一鍵打包壓縮目錄文件示例代碼

    這篇文章主要介紹了php一鍵打包壓縮目錄文件代碼示例,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-10-10
  • nginx簡單配置多個php服務(wù)實例教程

    nginx簡單配置多個php服務(wù)實例教程

    nginx安裝剛安裝好是不能訪問php文件的,需要我們進行配置,下面這篇文章主要給大家介紹了關(guān)于nginx簡單配置多個php服務(wù)的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-01-01
  • Yii2中DropDownList簡單用法示例

    Yii2中DropDownList簡單用法示例

    這篇文章主要介紹了Yii2中DropDownList簡單用法,實例分析了DropDownList下拉列表的基本調(diào)用方法,需要的朋友可以參考下
    2016-07-07
  • laravel的用戶修改密碼與綁定郵箱的詳細操作

    laravel的用戶修改密碼與綁定郵箱的詳細操作

    這篇文章主要介紹了laravel的用戶修改密碼與綁定郵箱的詳細操作,本文給大家介紹的非常詳細,對laravel修改密碼與綁定郵箱的操作感興趣的朋友一起看看吧
    2021-09-09
  • PHP http請求超時問題解決方案

    PHP http請求超時問題解決方案

    這篇文章主要介紹了PHP http請求超時問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • ThinkPHP 5 AJAX跨域請求頭設(shè)置實現(xiàn)過程解析

    ThinkPHP 5 AJAX跨域請求頭設(shè)置實現(xiàn)過程解析

    這篇文章主要介紹了ThinkPHP 5 AJAX跨域請求頭設(shè)置實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10

最新評論

衢州市| 泸州市| 分宜县| 东光县| 精河县| 综艺| 田林县| 鹤庆县| 宝清县| 家居| 龙山县| 杭锦后旗| 黔东| 淳化县| 抚顺市| 洛扎县| 塘沽区| 鸡东县| 香格里拉县| 日土县| 思茅市| 泸溪县| 琼海市| 武安市| 德州市| 渭源县| 桂平市| 托克托县| 塘沽区| 滦平县| 延安市| 象山县| 获嘉县| 临武县| 美姑县| 台湾省| 扶风县| 荔波县| 阳朔县| 荆州市| 新乐市|