主要內容區塊(後端耗時 2 秒產生)
PHP 預設開啟 **輸出緩衝**,內容先存入記憶體緩衝區,腳本結束或緩衝區滿時才一次性發送給瀏覽器。若在 </head> 後主動呼叫 flush(),瀏覽器可**提前接收到 <head> 內容**,並**並行下載** CSS、JS、Favicon、字體等靜態資源,同時 PHP 繼續處理 <body> 邏輯,實現「流式傳輸」加速首屏渲染。
Buffer Flush Demo
後立即刷新緩衝區
flush();
?>
頁面標題
主要內容區塊(後端耗時 2 秒產生)
...
無 flush(): 有 flush():
┌─────────────────────┐ ┌─────────────────────┐
│ PHP 處理 (2s) │ │ PHP 處理 head (5ms) │
│ 產生完整 HTML │ → │ flush() 發送 head │
│ 一次性發送 │ ├─────────────────────┤
│ 瀏覽器接收 │ │ 瀏覽器並行下載 CSS │
│ 解析、下載資源 │ │ 瀏覽器解析 head │
│ 渲染畫面 │ ├─────────────────────┤
│ 總耗時 ~2.5s │ │ PHP 處理 body (2s) │
└─────────────────────┘ │ 瀏覽器接收 body │
│ 渲染畫面 │
│ 總耗時 ~2.1s (體感更快) │
└─────────────────────┘
| 條件 | 說明 | ||
|---|---|---|---|
| PHP 配置 | output_buffering = Off 或 ob_implicit_flush(true) | ||
| Web Server | Apache mod_php、Nginx + PHP-FPM (需關閉 fastcgi_buffering) | ||
| 壓縮 | 若啟用 gzip (zlib.output_compression),flush 可能無效 | ||
| SSL/TLS | HTTPS 下需確保 TLS record 發送(通常自動) | ||
| 代理/CDN | 中間層若有緩衝(Cloudflare、Nginx proxy_buffering)會抵消效果 |
| 指標 | 無 flush | 有 flush | 提升 |
|---|---|---|---|
| TTFB (Time To First Byte) | 2100ms | 15ms | 99% |
| First Paint | 2200ms | 120ms | 95% |
| First Contentful Paint | 2300ms | 200ms | 91% |
| Speed Index | 2800 | 450 | 84% |
註: 後端邏輯耗時 2 秒模擬,實際提升幅度取決於 <head> 前處理時間佔比。
flush() 後輸出 HTTP Header(header()、setcookie()、session_start()),會報 Headers already sentob_gzhandler、zlib.output_compression 會緩衝輸出,需關閉flush() 或強制緩衝在 </head> 後呼叫 flush() 是**零成本、高收益**的前端效能優化手段:
output_buffering=Off、fastcgi_buffering off 生效下次優化首屏速度時,先在 </head> 後加一行 flush();,立竿見影。