如何高效批量获取文件大小并一次性写入文本文件
技术百科
花韻仙語
发布时间:2026-01-01
浏览: 次 本文介绍一种优化 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 优化实践。
# 适用于
# 先将
# 这会
# 而非
# 如需
# 降至
# 数千
# 循环
# 指针
# 字符串
# 报错
# php
# 遍历
# fopen
# fclose
# 安全检查
# 优化实践
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- c# Task.ConfigureAwait(tr
- php在Linux怎么部署_LNMP环境搭建PHP
- Python数据抓取合法性_合规说明【指导】
- Windows10怎样连接蓝牙设备_Windows
- Win11更新后变慢怎么办_Win11系统更新后卡
- Mac如何设置动态壁纸?(让桌面动起来)
- Win11怎么关闭自动修复_跳过Win11开机自动
- Windows系统被恶意软件破坏后的恢复策略_错误
- Win11怎么设置多显示器任务栏 Win11扩展任
- 为什么Go建议使用error接口作为错误返回_Go
- Win11怎么快速锁屏_Win11一键锁屏快捷键W
- Windows服务持续崩溃怎样修复_系统服务保护机
- c++ unordered_map怎么用 c++哈
- Win11怎么关闭防火墙通知_屏蔽Win11安全中
- c++获取当前时间戳_c++ time函数使用详解
- Win11怎么设置默认邮件客户端 Win11修改M
- 如何在Golang中处理URL参数_Golang
- Python文本编码与解码_跨平台解析说明【指导】
- Win11如何设置电源计划_Win11电源计划优化
- 如何使用Golang实现错误包装与传递_Golan
- Windows执行文件被SmartScreen拦截
- 如何在Golang中使用闭包_封装变量与函数作用域
- php485读数据时阻塞怎么办_php485非阻塞
- Windows 11如何查看系统激活密钥_Wind
- Win10怎样卸载自带Edge_Win10卸载Ed
- Windows笔记本无法进入睡眠模式怎么办?(电源
- Windows10如何更改任务栏高度_Win10解
- 短链接怎么用php递归还原_多层加密链接的处理法【
- Win11如何暂停系统更新 Win11暂停更新最长
- c++输入输出流 c++ cin与cout格式化输
- php能跑在stm32上吗_php在stm32微控
- 如何在Golang中配置代码格式化工具_使用gof
- Python与Docker容器化部署实战_镜像构建
- Dapper的Execute方法的返回值是什么意思
- php怎么下载安装后设置默认字符集_utf8配置步
- Python多进程教程_multiprocessi
- Win11怎么关闭定位服务_保护Win11位置隐私
- C++ static_cast和dynamic_c
- Win11怎么看电池循环次数_Win11笔记本电池
- Windows10怎样设置家长控制_Windows
- Win11怎么设置快速访问_Windows11文件
- php打包exe如何加密代码_防反编译保护方法【技
- 电脑的“网络和共享中心”去哪了_Windows 1
- Win10如何卸载自带Edge_Win10彻底卸载
- c++怎么使用std::filesystem遍历文
- Win10如何更改网络连接_Windows10以太
- Win11怎么退出微软账户_切换Win11为本地账
- 如何使用Golang实现容器自动化运维_Golan
- Mac怎么设置鼠标滚动速度_Mac鼠标设置详细参数
- Go 中 defer 语句在 goroutine

($result)) {
$fp = fopen("result.txt", "a");
if ($fp) {
fwrite($fp, $result);
fclose($fp);
echo "✅ 所有文件大小已一次性写入 result.txt
QQ客服