md5_file是生成文件摘要的最轻量跨平台方案,直接流式处理二进制内容,避免内存溢出;批量处理需结合scandir与is_file过滤,加超时和错误兜底,并推荐json lines格式输出。

用 file_get_contents + md5_file 快速生成文件摘要
多数场景下,“批量摘要”其实只要稳定、可复现的哈希值就够了,md5_file 是最轻量且跨平台的选择。它直接读取文件二进制内容计算 MD5,不依赖扩展,PHP 5.1+ 原生支持。
常见错误是先用 file_get_contents 读取再 md5,这会把大文件全加载进内存,容易触发 Allowed memory size exhausted。而 md5_file 内部流式处理,安全得多。
- 对单个文件:直接调用
md5_file('/path/to/file.txt') - 批量处理时,用
glob或scandir获取路径列表,逐个传入md5_file,避免一次性读所有文件 - 若需 SHA-256 等更强摘要,可用
hash_file('sha256', $path),性能略低但更安全
遍历目录时跳过子目录和隐藏文件
用 glob('*.txt') 看似简单,但默认不递归,也匹配不到 .gitignore 这类点开头的文件;而 scandir 返回所有条目(包括 . 和 ..),不加过滤会出错。
推荐组合:array_filter + is_file + 显式排除点开头名称:
foreach (scandir($dir) as $entry) {
$path = $dir . '/' . $entry;
if ($entry[0] === '.' || !is_file($path)) continue;
$hash = md5_file($path);
echo "$entry: $hash
";
}
-
is_file($path)能准确跳过目录、符号链接、设备文件等非普通文件 - 不依赖
glob('*')的 shell 层面通配,避免不同系统对大小写或编码的歧义 - Windows 下注意路径分隔符,建议统一用
/(PHP 内部自动兼容)
大文件或慢存储时加超时与错误兜底
md5_file 在 NFS、Samba 或损坏 U 盘上可能卡住几秒甚至更久,而 PHP 默认没有 I/O 超时。不处理会导致脚本假死或被 max_execution_time 中断,但中断前已占用资源。
- 用
set_time_limit(0)临时禁用执行时间限制(仅限 CLI 场景) - 对每个文件单独封装 try/catch,捕获
Warning: md5_file(): Failed to open stream类错误 - 加简单耗时检测:用
microtime(true)记录起始时间,超过 5 秒就continue并记录警告 - 不要用
@md5_file()抑制警告——它会掩盖权限不足、路径不存在等真实问题
输出结构化结果便于后续处理
直接 echo 文本不利于管道传递或导入数据库。如果要批量比对或存档,建议输出 JSON 行(JSON Lines)格式,每行一个文件的摘要信息:
$result = [
'file' => basename($path),
'size' => filesize($path),
'md5' => md5_file($path),
'mtime' => filemtime($path)
];
echo json_encode($result, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) . "
";
- 包含
size和mtime可辅助判断是否真变化(比如仅修改时间但内容未变) -
JSON_UNESCAPED_SLASHES避免 Windows 路径中的被转义成\ - 别用
json_encode($allFiles)一次性输出大数组——内存峰值高,且下游不易流式解析
真正麻烦的是混合编码文件名(比如 GBK 名称在 UTF-8 环境下)、硬链接去重、或需要同时校验内容与元数据一致性——这些得额外处理,基础摘要先跑稳再说。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











