PHP輸出緩衝(一) 緩衝區原理

2021-06-21 23:49:35 字數 2582 閱讀 8035

從php指令碼echo(print、print_r...)內容之後,是如何顯示給使用者的呢,下面看看流程

echo、print => php output_buffering => webserver buffer => browser buff => browser display

即:指令碼輸出 => php的緩衝區設定 => 系統的緩衝區設定(apache、nginx) => 瀏覽器的緩衝區設定 => 顯示給使用者

php buffer

php執行的結果先放入緩衝區(buffer),只有當緩衝區滿了或者php執行完畢,才將資料輸出去。

緩衝區是通過php.ini中的output_buffering變數控制。output_buffering的預設值是off,可以設定大於0的數值來開啟buffer。具體介紹

但是這裡需要注意的是:

1)使用ini_set是無法修改buffer的設定。

2)不管php.ini中output_buffering設定,cli模式下的php始終預設是output buffering為關閉的。但是你可以通過ob_start()將buffer開啟。

需要注意的是php.ini中php buffer是關閉的,再次呼叫ob_end_flush()會報warning。

webserver buffer

這裡主要講apache和nginx的緩衝區。

1、apache buffer

當php的輸出資料給apache伺服器時,它也會做一層buffer(也將資料放入它的緩衝區,當緩衝區資料滿或執行完畢時,才輸出資料)。

若想關閉緩衝區,可以在php層使用flush()來強制將緩衝區資料輸出。

fulsh() 的工作原理:在apache module的sapi下, flush會通過呼叫sapi_module的flush成員函式指標, 間接的呼叫apache的api: ap_rflush重新整理apache的輸出緩衝區,

當然手冊中也說了, 有一些apache的其他模組, 可能會改變這個動作的結果.例如mod_gzip,可能自己進行輸出緩衝區,這將導致flush()函式產生的結果不會立即被傳送到客戶端瀏覽器。

2、nginx buffer

nginx使用fastcgi緩衝區來緩衝資料。很遺憾的是,

fastcgi是強制將buffer開啟的,無法關閉緩衝區。

有人有可能會想,無法關閉可以將buffer設定的足夠小,來使緩衝資料輸出,達到無緩衝的效果。但是這個想法無法實現。

原因一:fastcgi buffer無法識別小於1k的數值。

原因二:受引數之間大小關係的影響。

具體可以看看fastcgi的一些buffer設定。

fastcgi_buffer_size:用來儲存response的header資料。

fastcgi_buffers:用來儲存response的內容資料.

fastcgi_busy_buffers_size:用來控制同時傳輸到客戶端的buffer數量。一旦fastcgi_buffers設定的 buffer被寫入,直到buffer裡面的資料被完整的傳輸完(傳輸到客戶端),這些buffer將會一直處在busy狀態,我們不能對這些 buffer進行任何別的操作。所有處在busy狀態的buffer size加起來不能超過fastcgi_busy_buffers_size。

引數之間大小關係:

fastcgi_busy_buffers_size < (all fastcgi_buffers – one buffer) 並且fastcgi_busy_buffers_size>=max (fastcgi_buffer_size, one fastcgi _buffers)。

例如,在nginx.conf配置中有:

fastcgi_buffers 4 128k

fastcgi_buffer_size 256k

那麼fastcgi_busy_buffers_size<(4*128k – 4k) 並且fastcgi_busy_buffers_size>=max(256k, 128k)

其中,4k(one buffer的大小)是linux系統預設的快取大小,即乙個記憶體頁。

若fastcgi_buffer_size設定的很小,會導致header過小的錯誤。你也同樣無法保證設定的值會滿足所有的情況。

要注意的是:

flush, 嚴格來講, 這個只有在php做為apache的module(handler或者filter)安裝的時候, 才有實際作用. 它是重新整理webserver(可以認為特指apache)的緩衝區.所以在nginx下,flush()函式是無法起作用的。

browser buffer

ie為256bytes, chrome與firefox為1000bytes,只有輸出資料達到了這個長度或者指令碼結束瀏覽器才會將資料輸出在頁面上。

在 php端無法關閉瀏覽器buffer。

為了使得資料及時輸出,可以在傳送真正內容 資料前,傳送一些空格來填滿瀏覽器的buffer。

瀏覽器的buffer一滿,就會將其他新輸出的資料輸出。

但是不同的瀏覽器會設定不同的buffer大小。

為了保險期間,可以傳送4096個空格,因為目前比較流行的瀏覽器的buffer還沒有超過4k(乙個內頁大小)。

php 緩衝區,PHP的輸出緩衝區

1 什麼是緩衝區?緩衝區的作用是把輸入或者輸出的內容先放進記憶體,而不顯示或者讀取,最本質的作用就是協調高速cpu和相對緩慢的io裝置 磁碟等 的運作。2 php在執行的時候,在什麼地方有用到緩衝區?當執行php的時候,如果碰到了echo print r之類的會輸出資料的 php就會將要輸出的資料放...

輸入緩衝區與輸出緩衝區

本博文通過一段程式來理解輸入緩衝區與輸出緩衝區。程式如下 author wanghao created time thu 17 may 2018 06 03 12 ampdt file name test.c description include int main int argc,const c...

輸出緩衝區

輸出緩衝區 printf 輸出緩衝區 顯示器 printf函式列印的內容會先送入輸出緩衝區,輸出緩衝區將資料送到顯示器我們才能看見。什麼時候輸入緩衝區會將資料送到顯示器 什麼時候輸出緩衝區會清空 1 當輸出乙個換行符時 2 當輸入時,先清空輸出緩衝區 3 輸出緩衝區滿時 4 當主動呼叫fflush ...