
本文介绍一种优化 php 文件大小统计性能的方法:先将所有结果暂存于内存字符串,再一次性写入磁盘,避免频繁的 i/o 开销,显著提升执行效率。
在处理大量文件时(例如遍历 img/ 目录下数百个 PNG 图片),原始代码每次循环都调用 fopen("result.txt", "a") 和 fclose(),这会导致多次磁盘 I/O 操作——而磁盘写入远慢于内存操作。即使使用追加模式("a"),PHP 仍需反复定位文件末尾、校验权限、触发系统调用,累积开销明显。
更优方案是:将所有待写内容先拼接至一个 PHP 字符串变量(即“内存缓存”),循环结束后仅执行一次文件写入。以下是改进后的完整示例:
";
$result .= $line . "\n"; // 追加到内存缓冲区(无 I/O)
}
}
// ✅ 仅一次打开、写入、关闭
if (!empty($result)) {
$fp = fopen("result.txt", "a");
if ($fp) {
fwrite($fp, $result);
fclose($fp);
echo "✅ 所有文件大小已一次性写入 result.txt
";
} else {
echo "❌ 无法打开 result.txt 进行写入,请检查文件权限和路径
";
}
} else {
echo "⚠️ 未找到任何 PNG 文件或无有效文件大小数据
";
}
?>? 关键优化点说明:
- ✅ 减少 I/O 次数:从 N 次(N = 文件数量)降至 1 次,对百级文件可提速 5–10 倍以上;
- ✅ 避免资源泄漏风险:原代码中 fclose("result.txt") 语法错误(应传入文件指针而非字符串),已修正;
- ✅ 增强健壮性:添加 is_file() 判断,防止 filesize() 对非文件项报错;
- ✅ 错误处理:检查 fopen 返回值,确保写入成功;
⚠️ 注意事项:
- 内存缓存适用于中小规模数据(如数千行以内)。若文件数量极大(如 10 万+),需考虑分批次写入或使用 SplFixedArray + 流式写入,防止内存溢出;
- "a" 模式会持续追加内容。如需覆盖旧结果,改用 "w" 模式(注意:"w" 会清空原文件);
- 生产环境建议使用绝对路径或 __DIR__ . '/img/' 明确目录位置,避免相对路径歧义。
综上,该方法以极小改动实现显著性能提升,是 PHP 批量文件处理中的经典 I/O 优化实践。










