PHP中读写文件与数据库的性能对比实测

小林子
小林子
发布时间:2026-10-14 | 7人浏览过
原创

在日常开发中,处理小量配置或简单索引时,究竟是存入数据库还是单独的文件更优?本文基于 PHP 环境进行实测对比。结果表明,在不涉及复杂查询的场景下,直接操作本地文件的 I/O 效率显著优于数据库连接与查询开销。

实验目标与准备条件

为了量化不同读取方式的耗时差异,测试程序将执行以下两个核心维度:

  • 固定文本数据:约 4KB 的内容块,模拟普通文章片段或配置信息。
  • 整数 ID 寻址:仅查询记录主键,模拟轻量级的元数据读取。

为保证公平性,针对数据库调用封装了两次函数调用的动作,读取文件时也保持了同等的逻辑结构。代码逻辑主要包含以下几个测试分支:

  1. 使用 fetch_row 获取结果数组。
  2. 使用 fetch_array 获取结果数组。
  3. 使用 fetch_object 获取对象属性。
  4. 使用 file_get_contents 一次性读取文件内容。
  5. 使用 fopen / fread / fclose 标准流读取方式。

真实操作顺序与结果

第1步:执行数据库查询基准测试

首先建立 MySQL 连接,对同一记录(ID=1)连续执行 100,000 次查询。分别统计三种获取行数据的函数的平均消耗时间。

测试结果显示,在读取 4K 大小文本时,三种方式的耗时均接近 16.7 秒。当仅读取整形 ID 时,耗时下降至约 12.8 秒左右。

第2步:执行 file_get_contents 文件读取测试

将上一步从数据库取出的内容保存为本地文本,随后在相同循环次数下使用 file_get_contents 直接加载该文件。

结果显示,读取 4K 文本耗时约 5.46 秒,读取整型数据耗时约 5.66 秒。这表明单纯读取物理文件的速度极快且稳定。

第3步:执行 fopen/fread 文件读取测试

改用标准的文件流指针方式(检查存在性 → 打开 → 读取指定大小 → 关闭)。此过程由于增加了多次函数交互和系统调用:

读取 4K 文本耗时约 11.46 秒,读取整型耗时约 11.54 秒。虽然略低于数据库查询速度,但远不及 file_get_contents 高效。

第4步:综合对比观察

方法分类 4K文本 (10万次) 整形ID (10万次)
Fetch_row 16.73s 12.81s
Fetch_array 16.66s 12.66s
Fetch_object 16.77s 12.98s
file_get_contents 5.46s 5.66s
fopen/fread 11.46s 11.54s

分析与建议

根据上述数据和操作反馈,可得出以下关于读写效率的结论:

1. 磁盘操作的终极瓶颈
无论采用何种存储介质,任何持久化方案最终都将转化为硬盘的物理 I/O。只要不涉及排序、模糊匹配等计算,直接读取文件绕过了 SQL 解析、网络通信及数据库引擎内部状态机管理的开销,因此速度优势明显。

2. 函数选择的必要性
如果确定只读文件,务必优先使用 file_get_contents。它是一次性读取底层缓冲区,相比需手动管理句柄的 fopen/fread 组合,在处理常规文件大小时代价几乎可以忽略不计。

3. 选型建议
- 适合存为独立文件的情况:不需要做联合查询(Join)、数据校验强依赖数据库特性的配置项、或者超大二进制资源(图片/音视频)的路径映射表本身。

- 适合存入数据库的情况:需要高并发写入、多表关联检索、全文搜索能力、或者对结构化数据一致性有严格要求的业务。

以上就是PHP中读写文件与数据库的效率比较的详细内容,更多关于PHP性能优化的资料请关注本站其它相关文章!

相关标签:

本站声明

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

Python 相关产品和应用

全部下载

专题列表