PHP中读写文件与数据库的性能对比实测
在日常开发中,处理小量配置或简单索引时,究竟是存入数据库还是单独的文件更优?本文基于 PHP 环境进行实测对比。结果表明,在不涉及复杂查询的场景下,直接操作本地文件的 I/O 效率显著优于数据库连接与查询开销。
实验目标与准备条件
为了量化不同读取方式的耗时差异,测试程序将执行以下两个核心维度:
- 固定文本数据:约 4KB 的内容块,模拟普通文章片段或配置信息。
- 整数 ID 寻址:仅查询记录主键,模拟轻量级的元数据读取。
为保证公平性,针对数据库调用封装了两次函数调用的动作,读取文件时也保持了同等的逻辑结构。代码逻辑主要包含以下几个测试分支:
- 使用
fetch_row获取结果数组。 - 使用
fetch_array获取结果数组。 - 使用
fetch_object获取对象属性。 - 使用
file_get_contents一次性读取文件内容。 - 使用
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性能优化的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













