PHP 读取文本文件性能对比:file_get_contents 与 fread 实测

山间有风
山间有风
发布时间:2026-10-15 | 6人浏览过
原创

本文通过实测对比了 PHP 中不同文件读取方式的性能差异。结果显示,对于小型文本文件(如 3KB),使用 file_get_contents 或直接使用 fread 读取较大缓冲区,其速度远快于使用 fopen 配合 while(fgetc()) 逐字读取。实验数据表明,循环逐字读取的效率可能比内置函数低近百倍,建议在开发中优先使用高效内置函数以优化性能。

结果与结论:内置函数显著优于自定义循环

在本地环境下对大小为 3KB 的 XML 文件进行读取测试,不同的实现方式产生了巨大的性能差距。直接调用高级封装函数的耗时仅为毫秒级,而基于基础句柄的低级循环操作则显著拖慢了执行速度。这一结果提示开发者,在处理 I/O 密集型任务时,应尽量减少用户空间的循环逻辑,转而依赖底层优化过的 C 语言扩展函数。

准备条件

  • 目标文件:shadow.xml,文件大小约为 3KB。
  • 运行环境:本地 PHP 测试环境。
  • 关注点:执行时间(秒)及CPU资源消耗。

真实操作顺序与性能分析

第1步:使用 file_get_contents 一次性读取

这是最常用的文件读取方式,它将文件内容直接加载到内存字符串中。由于内部实现经过了高度优化,且减少了系统调用次数,因此在读取小文件时表现最佳。

复制代码 代码如下:

file_get_contents('shadow.xml');

测试结果:耗时 0.0003 秒。

第2步:使用 fopen + while + fgetc 逐字符读取

此方法打开文件句柄后,通过循环每次读取一个字符。虽然这在理论上可以节省内存(不需要一次性加载全部内容),但在处理小文件时,fgetc 的频繁调用以及 PHP 引擎对每一轮循环的解释开销导致了严重的性能瓶颈。

复制代码 代码如下:

$indexFile = fopen('shadow.xml', 'r');while ( !feof($indexFile)) fgetc( $indexFile);

测试结果:耗时 0.026 秒。

第3步:使用 fopen + fread 批量读取

与逐字符读取不同,fread 允许指定读取字节数(此处为 10000 字节)。由于文件大小仅 3KB,这次读取实际上一次性完成了整个文件的加载。尽管使用了底层的 fopen,但因为减少了循环和多次系统调用的开销,其性能与 file_get_contents 相当。

复制代码 代码如下:

$indexFile = fopen('shadow.xml', 'r');fread($indexFile, 10000);

测试结果:耗时 0.0003 秒。

完成判断与分析

通过上述三步对比可以发现:

  1. 效率差异巨大:第1步和第3步的耗时均为 0.0003 秒,而第2步耗时 0.026 秒。后者比前者慢了将近 100 倍。
  2. 瓶颈所在:性能差异主要牺牲在 while 循环和 fgetc 函数的重复调用上。每一次调用都涉及 PHP 堆栈切换、参数解析及内部检查,累积开销远超实际 I/O 等待时间。
  3. 适用场景:只有在处理极大文件(如 GB 级别日志)且无法一次性载入内存时,才建议使用 fopen + fread(固定缓冲区) 的方式流式处理。对于绝大多数常规业务场景,file_get_contents 是更简洁且高效的选择。

简要总结

在进行 PHP 文件 I/O 操作时,切勿为了“节省一点内存”而采用低效的逐字循环读取策略。file_get_contents 不仅代码简洁,且在中小文件场景下性能最优。若必须使用流式处理,请确保使用 fread 读取合理的缓冲区大小,而非逐个字符处理。

以上就是 PHP 文本文件读取效率对比的详细测试与分析,更多关于 PHP 性能优化的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表