当前位置: 首页> 最新文章列表> 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_contentsfpassthru
返回值字符串(文件内容)输出文件内容,无返回值
内存占用整个文件加载到内存流式读取,内存占用低
适合处理的数据大小小文件(如配置、模板)大文件(如视频、下载内容)
使用复杂度简单稍复杂(需打开句柄)
是否直接输出

什么时候应该优先选择 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>