PHP 默認開啟輸出緩沖。瀏覽器只有收到完整 HTML 才開始渲染。在 `` 後調用 `flush()`,可讓瀏覽器**提前接收 `
` 內容 (CSS、JS、Favicon、預載資源)**,並行下載,無需等待耗時的後端業務邏輯 (數據庫查詢、模板渲染、API 調用) 完成。這是零成本、高收益的前端性能優化手段。
首屏加速示例
後、 前強制刷新
// 1. 刷新 PHP 級緩沖區 (如果開啟了 ob_start)
if (function_exists('ob_get_level') && ob_get_level() > 0) {
ob_flush();
}
// 2. 刷新 Web 服務器級緩沖區 (發送到瀏覽器)
flush();
?>
'歡迎', 'list' => range(1, 10)];
?>
| 條件 | 要求 | 說明 |
|---|---|---|
| PHP 配置 | `output_buffering = Off` 或 具體大小 (如 4096) | php.ini 或 .user.ini。若為 `On`/大值,需配合 `ob_flush()` 先刷 PHP 緩沖。 |
| Web 服務器 | Nginx: `fastcgi_buffering off;` / Apache: 無特殊限制 | Nginx 默認開啟 `fastcgi_buffering`,會緩存 FastCGI 響應體。**必須在 location 塊關閉**,否則 `flush()` 內容卡在 Nginx 緩沖區不發送給瀏覽器。 |
| 壓縮 | 關閉 gzip 或 確保瀏覽器支援流式解壓 | Nginx `gzip on` 會等待完整響應體再壓縮。可針對動態頁關閉: `gzip off;` 或 使用 `chunked` 編碼 (HTTP/1.1 默認)。 |
| SSL/TLS | 無特殊限制 | HTTPS 下同樣生效,TLS 記錄層會分片發送。 |
| 瀏覽器 | 現代瀏覽器均支援流式渲染 | 極舊 IE 可能需 `` 開始標簽後才渲染,現代環境無憂。 |
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
# 核心: 關閉 FastCGI 緩衝, 允許流式傳輸
fastcgi_buffering off;
fastcgi_request_buffering off; # 也關閉請求體緩衝 (大文件上傳場景)
# 可選: 禁用 gzip (若發現 flush 不生效)
# gzip off;
}
`flush()` 是一把「外科手術刀」:用對了能精準切開首屏渲染阻塞,用錯了 (未關 Nginx 緩衝、輸出過早導致頭部重複) 反而產生 Bug。請在**完全理解緩沖層級**的前提下,針對核心業務頁面謹慎應用。