php輸出緩衝機制

2021-07-08 17:52:25 字數 1321 閱讀 9963

php輸出快取模式:**快取

指令碼輸出echo/print_r ===> php_buffer ===> tcp_buffer ===> 瀏覽器_buffer ===> 瀏覽器顯示

1-瀏覽器_buffer(echo str_repeat("

", 200).'hello sjolzy.cn

';),這裡是否是瀏覽器快取的影響還是輸出足夠大爆到最大快取了,還需要研究

2-php_buffer由7個ob_系列函式控制,作用附後

--php_buffer範圍內可以開啟多級緩衝區,此時ob_系列函式的控制類似堆疊的多級進出控制

--在官方文件中提到當開啟多級緩衝的時候,ob_系列函式中某些影響頂層緩衝,有些影響當前緩衝

--我想這是翻譯的問題,應該都表示當前緩衝

--在apache.php.ini中output_buffering = 4096,就相當於開啟了第乙個緩衝區

--當此緩衝區的具體數值似乎不起效,只有off或者0才看到關閉第一層緩衝區的效果

3-tcp_buffer由2個函式控制,flush()手動,ob_implicit_flush()自動

--這兩個函式是在tcp_buffer範圍起效,所以對於php_buffer範圍內的ob_系列函式來說是全域性的

--由於有tcp_buffer緩衝的存在,又不知道這個快取有多大,所以瀏覽器是否顯示資訊,絕對一定要受到這2個函式的影響

--無論php_buffer緩衝是否已滿,是否已被ob_系列函式刷出

--在thinkphp3.2.0中2次使用ob_get_clean(),第一次無輸出,第二次有輸出,就是因為第一次顯示關閉了ob_implicit_flush(0)

--而第二次的輸出就是超過了tcp_buffer上限的輸出

ob_系列函式 序號

名稱關閉

刷出獲得內容清空1

ob_clean××

×√2ob_end_clean√×

×√3ob_end_flush√√

×√4ob_flush×√

×√5ob_get_clean<2,6>√×

√√6ob_get_contents××

√×7ob_get_flush

<3>√√

√√備註:ob_end_flush()和ob_get_flush()的情況有點特別

--函式尾的_flush應該表示的是將緩衝區的內容放到tcp_buffer中

--如果當前緩衝區的外層沒有緩衝區,情況確實如此,使用flush()後就可在瀏覽器輸出

--但是當當前緩衝區外層還有緩衝區時,此_flush就不是放入tcp_buffer而是放入上級(不是最外層)緩衝區尾部

--切記!

PHP重新整理輸出緩衝

同 樣的道理,在php中,當執行echo,print的時候,輸出並沒有立即通過tcp傳給客戶端瀏覽器顯示,而是將資料寫入php buffer。php output buffering機制,意味在tcp buffer之前,建立了一新的佇列,資料必須經過該佇列。當乙個php buffer寫滿的時候,指令...

PHP中輸出緩衝

在php中,當執行echo,print的時候,輸出並沒有馬上通過tcp傳給client瀏覽器顯示,而是將資料寫入php buffer。php output buffering機制,意味在tcp buffer之前,建立了一新的佇列,資料必須經過該佇列。當乙個php buffer寫滿的時候,指令碼程序會...

PHP中重新整理輸出緩衝

buffer是乙個記憶體位址空間,linux系統預設大小一般為4096 1kb 即乙個記憶體頁。主要用於儲存速度不同步的裝置或者優先順序不同的 裝置之間傳辦理資料的區域。通過buffer,可以使程序這間的相互等待變少。這裡說乙個通俗一點的例子,你開啟文字編輯器編輯乙個檔案的時候,你每輸入 乙個字元,...