當前位置: 首頁> 最新文章列表> fpassthru 和file_get_contents 有什麼區別?什麼時候應該優先選擇fpassthru 函數?

fpassthru 和file_get_contents 有什麼區別?什麼時候應該優先選擇fpassthru 函數?

gitbox 2025-08-27

<span><span><span class="hljs-meta"><?php</span></span><span> </span><span><span class="hljs-comment">// 本文旨在解释 PHP 中 fpassthru 和 file_get_contents 两个函数的区别,并分析在实际应用中如何选择它们。</span></span><span> </span><span><span class="hljs-comment">// ------------------------------------------------------------</span></span><span> </span><span><span class="hljs-comment"># fpassthru 和 file_get_contents 有什么区别?什么时候应该优先选择 fpassthru 函数?</span></span><span> 在 PHP 中处理文件内容时,`</span><span><span class="hljs-title function_ invoke__">file_get_contents</span></span><span>()` 和 `</span><span><span class="hljs-title function_ invoke__">fpassthru</span></span><span>()` 是两个常用的函数,它们虽然都可用于读取文件,但使用场景和性能表现存在明显差异。了解它们的差异,对于编写高效、可靠的代码至关重要。 </span><span><span class="hljs-comment">## file_get_contents 简介</span></span><span> `</span><span><span class="hljs-title function_ invoke__">file_get_contents</span></span><span>()` 是一个一次性读取整个文件内容的函数。它将文件内容作为字符串返回,适用于文件体积不大,且需要对内容进行进一步处理的场景。 **语法:** ```php </span><span><span class="hljs-variable">$content</span></span><span> = </span><span><span class="hljs-title function_ invoke__">file_get_contents</span></span><span>(</span><span><span class="hljs-string">'example.txt'</span></span><span>); </span></span>

  • 簡潔易用。

  • 可直接將內容賦值給變量。

  • 可用於網絡流(支持HTTP、FTP 協議)。

缺點:

  • 會一次性讀取文件到內存,不適合大文件。

  • 對資源流的控制較少。

fpassthru 簡介

fpassthru()是從一個打開的文件指針開始讀取數據,直到文件末尾,並直接將其輸出(echo)到標準輸出。它通常用於將文件內容直接傳送給瀏覽器,尤其適合大文件的高效傳輸。

文法:

 <span><span><span class="hljs-variable">$fp</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'example.txt'</span></span><span>, </span><span><span class="hljs-string">'rb'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">fpassthru</span></span><span>(</span><span><span class="hljs-variable">$fp</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$fp</span></span><span>);
</span></span>

優點:

  • 適合大文件或流式輸出(例如視頻、下載文件)。

  • 不會佔用大量內存。

  • 直接輸出,避免中間變量。

缺點:

  • 無法直接獲取文件內容作為變量。

  • 使用前需要手動打開文件句柄。

核心區別對比

特性file_get_contents fpassthru
返回值字符串(文件內容)輸出文件內容,無返回值
內存佔用整個文件加載到內存流式讀取,內存佔用低
適合處理的數據大小小文件(如配置、模板)大文件(如視頻、下載內容)
使用複雜度簡單稍複雜(需打開句柄)
是否直接輸出

什麼時候應該優先選擇fpassthru?

以下場景推薦使用fpassthru()

  1. 輸出大文件(如ZIP、PDF、MP4)下載
    它能避免內存佔用過高,提升性能。

  2. 以流的形式傳輸數據到客戶端
    可結合readfile()fpassthru()實現帶HTTP 頭部的下載接口。

  3. 不需要中間處理的直接輸出
    如只需傳輸文件,不需要內容分析或修改。

示例:使用fpassthru()實現文件下載功能

<span><span><span class="hljs-variable">$filename</span></span><span> = </span><span><span class="hljs-string">'large-file.zip'</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">'Content-Type: application/zip'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">'Content-Disposition: attachment; filename="'</span></span><span> . </span><span><span class="hljs-title function_ invoke__">basename</span></span><span>(</span><span><span class="hljs-variable">$filename</span></span><span>) . </span><span><span class="hljs-string">'"'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">'Content-Length: '</span></span><span> . </span><span><span class="hljs-title function_ invoke__">filesize</span></span><span>(</span><span><span class="hljs-variable">$filename</span></span><span>));
</span><span><span class="hljs-variable">$fp</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-variable">$filename</span></span><span>, </span><span><span class="hljs-string">'rb'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">fpassthru</span></span><span>(</span><span><span class="hljs-variable">$fp</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$fp</span></span><span>);
</span><span><span class="hljs-keyword">exit</span></span><span>;
</span></span>

總結

選擇file_get_contents()還是fpassthru() ,取決於你對文件的處理方式需求。如果你需要獲取文件內容並進行邏輯處理,選擇file_get_contents()更方便;如果你只需要高效地將文件傳輸給客戶端而不做處理, fpassthru()是更合適的選擇。

理解它們的區別,可以幫助你根據不同需求編寫更高效、健壯的PHP 程序。

 <span></span>