ob_flush()
將PHP 的輸出緩衝區內容強制發送給瀏覽器,但不關閉緩衝區,配合flush()一起使用時可以讓內容實時“推送”。
注意:為了保證輸出真正到達瀏覽器,通常要搭配flush()使用,而且服務器端和瀏覽器端均不能禁用緩存和壓縮。
<?php
// 關閉腳本執行時間限制(根據需要)
// set_time_limit(0);
// 開啟輸出緩衝
ob_start();
// 禁用瀏覽器緩存和壓縮,確保數據即時傳輸
header("Content-Type: text/plain");
header("Cache-Control: no-cache");
header("X-Accel-Buffering: no"); // 對於 Nginx 的禁用緩存
// 關閉 gzip 壓縮(若服務器默認開啟)
// 具體方法根據服務器環境配置
for ($i = 1; $i <= 5; $i++) {
echo "當前步驟:{$i}\n";
// 強制刷新 PHP 輸出緩衝區
ob_flush();
flush();
// 使用 time_nanosleep 進行微秒級延遲,0.5秒 = 500,000,000 納秒
time_nanosleep(0, 500000000);
}
echo "所有步驟完成!\n";
?>
ob_start() :啟動輸出緩衝,確保可以控制緩沖刷新。
echo :逐條輸出信息。
ob_flush() + flush() :強制將緩衝區內容髮送給客戶端,刷新瀏覽器顯示。
time_nanosleep(0, 500000000) :暫停0.5 秒(500,000,000 納秒),使輸出效果更加明顯,模擬實時過程。
適當設置HTTP 頭,避免瀏覽器和服務器緩存導致內容滯後。
服務器配置影響<br> 服務器(如Apache、Nginx)默認可能啟用輸出壓縮或緩衝,這會影響實時輸出效果確保關閉gzip 壓縮和加速緩存。
瀏覽器行為<br> 有些瀏覽器會積累內容直到達到一定大小才渲染,輸出內容過少時可能不會立即顯示可以嘗試輸出一定數量的空白字符以觸發渲染。
緩衝區大小
PHP 的輸出緩衝區和Web 服務器緩衝區大小都會影響輸出速度。可根據實際情況調整緩衝區大小。
PHP 版本
time_nanosleep從PHP 5.0.0 開始支持,確保你的環境符合要求。
通過結合time_nanosleep和ob_flush() ,我們可以在PHP 中實現逐步、分段的實時數據輸出,增強用戶對長時間運行腳本進度的感知。這種方法簡單易用,適合對延遲有微秒級需求的場景。
若配合合理的服務器和瀏覽器設置,可以獲得非常流暢的實時輸出效果,提升用戶體驗。