首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP flush 輸出緩衝控制深度解析:ob_flush vs flush、WebServer/瀏覽器緩衝層級、SSE實戰配置

     編輯:PHP 綜合知識

PHP輸出控制涉及三層緩衝:PHP層(ob_*)、WebServer層(Apache/Nginx)、瀏覽器層。ob_flush 清空PHP緩衝,flush 推送至WebServer(僅Apache模組模式有效)。正確順序:ob_flush(); flush();。本文深度解析機制差異、Nginx+PHP-FPM配置、SSE長連接實戰代碼。

緩衝層級架構

PHP腳本
    ↓ ob_flush() 清空PHP output_buffering
PHP內部緩衝區
    ↓ flush() 呼叫SAPI flush函數指針 (僅Apache模組有效)
Apache/Nginx 緩衝區
    ↓ 網路傳輸
瀏覽器接收緩衝區
    ↓ 瀏覽器渲染邏輯 (如IE需256字節才顯示、表格需才渲染)
用戶可見內容

關鍵函數差異

函數作用層級生效條件說明
ob_flush()PHP層啟用 output_buffering刷新PHP內部緩衝至SAPI
flush()WebServer層PHP為Apache模組 (handler/filter)調用 ap_rflush 刷新Apache緩衝

注意:Nginx + PHP-FPM (FastCGI) 下 flush() 無效,需配合 Nginx 配置。

常見干擾因素

  • Apache模組:mod_gzip、mod_deflate 可能自行緩衝導致 flush 延遲
  • 瀏覽器:Netscape 等待換行/標籤;IE 需 256 字節才開始顯示(常用 str_repeat(' ', 4096) 填充)
  • PHP配置:output_buffering、implicit_flush、zlib.output_compression

正確使用順序

if (ob_get_level() == 0) ob_start();
echo str_repeat(' ', 4096); // 填充觸發瀏覽器渲染

while ($condition) {
    echo "data: {$data}\n\n"; // SSE格式
    ob_flush(); // 1. PHP層 → SAPI
    flush();    // 2. SAPI → WebServer → 客戶端
    sleep(1);
}

Nginx + PHP-FPM 環境必加響應頭

header('X-Accel-Buffering: no');

作用:關閉 Nginx proxy_buffering 與 fastcgi_buffering(需 Nginx 1.5.6+),對 PHP-FPM 至關重要。比修改 nginx.conf 更靈活。

SSE (Server-Sent Events) 完整實戰代碼

Apache/通用版

 0) {
    $time = date('r');
    echo "data: The server time is: {$time}\n\n";
    ob_flush();
    flush();
    sleep(1);
}
?>

Nginx + PHP-FPM 版

 0) {
    $time = date('r');
    echo "data: The server time is: {$time}\n\n";
    ob_flush();
    flush();
    sleep(1);
}
?>

前端接收

var source = new EventSource("/sse.php");
source.onmessage = function(event) {
    console.log(event.data); // "The server time is: ..."
};

總結建議

  • 始終 ob_flush(); flush(); 成對使用,保證可移植性
  • 長連接/串流場景必加 X-Accel-Buffering: no (Nginx)
  • 填充 4096 空格解決 IE 等瀏覽器首屏延遲
  • 關閉 zlib.output_compression 避免雙重壓縮干擾
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved