2024 年 PHP 日本研討會

清空系統緩衝區

PHP 提供兩種相關的方法來清空(發送並捨棄內容)系統緩衝區:呼叫 flush() 函式,以及使用 ob_implicit_flush()implicit_flush php.ini 設定來啟用隱式清空。

輸出清空行為

停用隱式清空時,PHP 只會在呼叫 flush() 或腳本結束時清空輸出。

啟用隱式清空時,PHP 會在每個產生輸出的程式碼區塊後嘗試清空。此處的輸出是指長度非零且

注意 印出空字串或發送標頭不被視為輸出,不會導致刷新操作。

警告

如果啟用了隱式刷新,控制字元(例如 "\n""\r""\0")也會觸發刷新。

限制

此功能無法刷新使用者層級的輸出緩衝區。要將它們一起使用,必須先刷新使用者層級的輸出緩衝區,然後再刷新系統緩衝區,才能讓 PHP 產生任何輸出。

警告

呼叫 flush() 或啟用隱式刷新可能會干擾在 Web 環境中設定和發送標頭的使用者層級輸出緩衝區的輸出處理程式(例如 ob_gzhandler()),因為它會在這些處理程式執行之前發送標頭。

底層軟體/硬體實現的緩衝機制無法被 PHP 覆蓋,在使用 PHP 的緩衝控制函式時應將其納入考量。檢查網路伺服器/瀏覽器/控制台的緩衝設定並配合這些設定可以減輕潛在的問題。在 Web 環境中工作時,可以調整網路伺服器的緩衝設定或腳本的緩衝設定以協同工作,而解決各種瀏覽器的緩衝策略則可以通過調整 PHP 腳本中的緩衝來實現。在實現行緩衝的控制台上,可以在刷新輸出之前在適當的位置插入換行符。

SAPI 刷新差異

雖然每個 SAPI 的刷新實現方式略有不同,但這些實現都屬於以下兩種類型之一

  • 在 Web 環境中使用的 SAPI 會先刷新標頭,然後再刷新輸出。Apache2HandlerCGIFastCGIFPM 都是這類 SAPI
  • 其他 SAPI,例如 CLIembed,只會刷新輸出。

新增筆記

使用者貢獻的筆記

此頁面沒有使用者貢獻的筆記。
To Top