應用場景
- 大數據導入/導出進度顯示
- 視頻轉碼、圖片處理任務監控
- 爬蟲/採集器實時日誌
- 安裝向導步驟進度條
核心原理
PHP 默認開啟輸出緩衝,內容先存入內存緩衝區,腳本結束或緩衝區滿時才發送給瀏覽器。需關閉輸出緩衝並啟用隱式刷新,強制每次 echo/print 立即發送。
關鍵配置組合
\n";
完整測試範例
\n";
for ($i = 1; $i <= 20; $i++) {
echo "[$i] 處理任務步驟 $i ... ";
// 模擬耗時操作
sleep(1);
echo "完成\n";
// 可選:顯式刷新(隱式刷新通常已足夠)
// ob_flush();
// flush();
}
echo "\n所有任務完成!\n";
echo "";
關鍵函數對比
| 函數 | 作用 | 備註 |
| ob_end_clean() | 關閉並丟棄當前緩衝區 | 需循環調用清理嵌套緩衝 |
| ob_implicit_flush(true) | 開啟隱式刷新 | 等同於每次輸出後自動 flush() |
| ob_flush() | 刷新 PHP 內部緩衝區 | 需配合 flush() 使用 |
| flush() | 刷新 Web 服務器/瀏覽器緩衝 | 受服務器配置影響(如 Nginx proxy_buffering) |
常見阻礙與解決
| 現象 | 原因 | 解決 |
| 內容一次性輸出 | Nginx proxy_buffering on / gzip on | 在 Location 添加 proxy_buffering off; gzip off; 或響應頭 X-Accel-Buffering: no |
| Apache mod_deflate 壓縮延遲 | 壓縮模塊緩衝 | SetEnv no-gzip 1 或 .htaccess 禁用 |
| 瀏覽器不渲染 | 內容過少未觸發增量渲染 | 發送 ≥ 1KB 填充字符(空格、註釋) |
| FastCGI 緩衝 | php-fpm fastcgi_buffering | Nginx fastcgi_buffering off; |
生產環境建議
- 使用
ob_start() 手動控制緩衝區,而非依賴隱式刷新,便於異常處理。
- 長任務採用「主進程 + Worker」架構:主進程寫入 Redis/數據庫進度,前端 AJAX 輪詢顯示,避免長連接超時、瀏覽器緩衝等不可控因素。
- 輸出內容建議為 JSON 格式,前端解析渲染進度條、日誌面板。