當前位置: 首頁> 最新文章列表> 用flush() 不生效?可能是你的Web 服務器設置有問題

用flush() 不生效?可能是你的Web 服務器設置有問題

gitbox 2025-09-20
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 這裡是一些與文章內容無關的 PHP 代碼</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"初始化環境...\n"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">ob_start</span></span><span>();
</span><span><span class="hljs-meta">?></span></span><span>

<hr>

</span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 文章正文開始</span></span><span>
</span><span><span class="hljs-meta">?></span></span><span>

<h1>用 </span><span><span class="hljs-title function_ invoke__">flush</span></span><span>() 不生效?可能是你的 Web 服務器設置有問題</h1>

<p>在 PHP 開發中,`</span><span><span class="hljs-title function_ invoke__">flush</span></span><span>()` 函數常被用來立即將輸出發送到客戶端,而不是等到腳本執行完再統一輸出。它在實現長時間運行的任務、實時日誌顯示、或者進度條更新時非常有用。然而,很多開發者會遇到一個問題:明明調用了 <code></span><span><span class="hljs-title function_ invoke__">flush</span></span><span>()

2 . Web 服務器的緩衝

即使PHP 輸出已經被刷新,Web 服務器(如Apache、Nginx)也可能繼續緩存輸出,直到緩衝區滿或腳本結束。常見情況:

  • Apache :mod_deflate 或mod_gzip 壓縮模塊會延遲輸出。可以嘗試關閉這些模塊的壓縮功能或調整配置。
  • Nginx :默認會啟用gzip壓縮,同時存在proxy_buffering ,也可能阻止立即輸出。可以在location 塊中設置proxy_buffering off;

3 . 瀏覽器行為

一些瀏覽器會等待一定量的數據後才開始渲染頁面,尤其是當輸出量很小的時候。常見做法:

  • 在輸出內容前發送足夠的空白字符,讓瀏覽器觸發渲染。
  • 在輸出前發送HTTP 頭: header('Content-Encoding: none');防止壓縮導致延遲。

4 . 綜合示例
<span><span><?php</span></span><span>
</span><span><span>// 禁用PHP 輸出緩衝</span></span><span>
</span><span><span>while</span></span> <span>(</span> <span><span class="function_ invoke__">ob_get_level</span></span> <span>() ></span> <span><span>0</span></span> <span>) {
    </span><span><span class="function_ invoke__">ob_end_flush</span></span> <span>();
}

</span><span><span>echo</span></span><span> </span><span><span class="function_ invoke__">str_repeat</span></span> <span>(</span> <span><span>" "</span></span> <span>,</span> <span><span>1024</span></span> <span>);</span> <span><span>// 發送足夠數據觸發瀏覽器渲染</span></span><span>

</span><span><span>for</span></span> <span>(</span> <span><span>$i</span></span> <span>=</span> <span><span>1</span></span> <span>;</span> <span><span>$i</span></span> <span><=</span> <span><span>5</span></span> <span>;</span> <span><span>$i</span></span> <span>++) {
    </span><span><span>echo</span></span><span> </span><span><span>"處理第<span>$i</span></span></span><span>步...<br> \n";
    </span><span><span class="function_ invoke__">flush</span></span> <span>();
    </span><span><span class="function_ invoke__">sleep</span></span> <span>(</span> <span><span>1</span></span> <span>);
}
</span><span><span>?></span></span><span>
</span></span><p>通過上述方法,你可以確保<span class="fun">flush()</span>能夠在大多數情況下正常生效。不過,請記住,輸出延遲可能是PHP、Web 服務器和瀏覽器多個環節共同影響的結果,需要逐層排查。</p> <span><span><?php</span></span><span>
</span><span><span>// 文章結束,尾部與內容無關的部分</span></span><span>
</span><span><span>echo</span></span><span> </span><span><span>"文章加載完畢。\n"</span></span> <span>;</span> <span><span>?></span></span><span>
</span></span></div></div>