PHP中flush 與ob flush 的區別

2021-08-10 18:32:06 字數 1114 閱讀 3868

首先先講一下緩衝區,從http請求開始到將資料展現在螢幕上,資料有可能經過以下的緩衝區:php緩衝區,sapi(fast-cgi,cli等)緩衝區,瀏覽器緩衝區等。

php緩衝區可以理解為php自帶的資料輸出緩衝期,在php的配置檔案中,有如下設定

其中out_buffering預設大小為4k,也就是說如果我們的輸出資料小於4k時,資料會先放到緩衝區並不會立即輸出。等到資料攢足了4k在一起輸出給sapi.

如果是http請求,一般php要和nginx或者apache打交道。我用的是nginx,在這裡貼出配置

其中fastcgi_buffer_size 存放的是返回給客戶端的http的頭部資訊。這裡要說明一下,上面提到的php緩衝區是不存放header資訊的,只緩衝要返回給客戶端的內容。

其中fastcgi_buffers 代表有4塊大小為64k的緩衝區。等到fastcgi_buffers資料「滿了」webserver才會傳送給網路上的客戶端。

當php在cli模式下執行的時候,是沒有sapi緩衝區的,但是仍然具有php緩衝區。

說完緩衝區再說說flush()和ob_flush()。

flush()在我的理解看來就是輸出sapi的緩衝資料。

ob_flush()的作用範圍其實是php緩衝區,他一般是和ob_start()一起用的。一旦php**遇到ob_start(),那麼直到遇到ob_flush()之後才會將資料輸出,即使資料大於php配置檔案中out_buffering的值。

有的小夥伴在使用nginx的時候發現flush()不起作用。這是因為php與nginx和與apache工作的方式不一樣。與apache,php是作為apache的工作模組運營的,因此呼叫flush()函式重新整理sapi緩衝區的時候也告訴了apache向使用者輸出資料。但是nginx不是這樣的,php通過通用閘道器介面與nginx通訊,因此從php傳過來的資料要大於fastcgi_buffers的大小才會被nginx輸出。所以如果你用的是nginx,那麼請忘記flush()吧。

php 中ob flush函式 和 flush函式

ob flush 函式 取出php buffering中的資料,放入server buffering flush 函式 取出server buffering的資料,放入browser buffering 例如 echo str repeat m0sh1 1000 for i 0 i 4 i head...

剖析PHP中的輸出緩衝 flush之類

for i 10 i 0 i 按照php手冊裡的說法 該函式將當前為止程式的所有輸出傳送到使用者的瀏覽器。上面的這段 應該隔一秒鐘輸出一次 i。但是實際中卻不一定是這樣。有可能是等了10秒鐘後,所有的輸出同時呈現出來。好,我們來改一下這段 改成 ob end clean 修改部分 for i 10 ...

outputstream中flush的作用

部分outputstream的子類實現了快取機制,為了提高效率當write 的時候不一定直接發過去,有可能先快取起來一起發。flush 的作用就是強制性地將快取中的資料發出去 以下是outputstream原始碼注釋 方法重新整理此輸出流並強制將所有緩衝的輸出位元組被寫出。重新整理的常規協定是,呼叫...