當前位置: 首頁> 最新文章列表> 如何使用feof配合ob_flush和flush函數實現大文件的分段輸出?

如何使用feof配合ob_flush和flush函數實現大文件的分段輸出?

gitbox 2025-09-02
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 以下部分與文章內容無關,僅為示例前置代碼</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__">date_default_timezone_set</span></span><span>(</span><span><span class="hljs-string">'Asia/Shanghai'</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-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<h1>如何使用feof配合ob_flush和flush函數實現大文件的分段輸出?</h1>"</span></span><span>;

</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<p>在處理大文件下載或者生成大文件內容時,如果一次性將整個文件內容輸出到瀏覽器,容易導致PHP內存溢出或網頁長時間無響應。為了避免這種情況,可以採用分段輸出的方式,即每次輸出一部分內容,然後刷新緩衝區,讓瀏覽器逐步接收到數據。</p>"</span></span><span>;

</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<h2>關鍵函數說明</h2>"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<ul>"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<li><strong>feof(resource <span class="hljs-subst">$handle</span></span></span><span>)</strong>:檢查文件指針是否到達文件末尾。如果到達末尾返回 true,否則返回 false。</li>";
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<li><strong>ob_flush()</strong>:將 PHP 的輸出緩衝區內容髮送到瀏覽器,並清空緩衝區(需要開啟緩衝區)。</li>"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<li><strong>flush()</strong>:强制將服务器缓冲区中的内容发送到浏览器,使瀏覽器立即顯示輸出。</li>"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"</ul>"</span></span><span>;

</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<h2>實現思路</h2>"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<ol>"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<li>打開要輸出的文件,並判斷是否成功。</li>"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<li>循環讀取文件內容,可以按行或者按固定字節數讀取。</li>"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<li>在每次讀取輸出後,調用 <code>ob_flush()
" ; echo "

注意事項

"
; echo "
    "
; echo "
  • 確保PHP 配置中output_buffering已啟用,或者在腳本開頭使用ob_start()
  • "
    ; echo "
  • 如果在Web 服務器上運行,某些服務器(如Nginx)可能有自己的緩衝機制,需要適當調整配置。
  • "
    ; echo "
  • 不要一次性讀取整個大文件,避免內存佔用過高。
  • "
    ; echo " " ; echo

    "通過以上方法,即可使用feof配合ob_flushflush函數實現大文件的分段輸出,使瀏覽器能夠逐步接收到文件內容,提升用戶體驗並降低服務器內存壓力。

    "
    ; ?> <?php // 以下部分與文章內容無關,僅為示例尾部代碼 echo " \n" ; ob_end_flush (); ?>