md5_file() 的基本语法如下:
<code> $hash = md5_file('path/to/file.txt'); </code>如果成功,它将返回一个 32 位的十六进制字符串;如果失败,将返回 false。关键点在于:失败不抛出异常,而是返回布尔值 false,因此必须注意判断。
这是最常见的问题。如果指定的文件路径错误或者文件根本不存在,md5_file() 会直接失败并返回 false。
<code> $hash = md5_file('/invalid/path/to/file.txt'); if ($hash === false) { echo '文件路径无效或文件不存在'; } </code>排查建议:
使用 file_exists() 先确认文件是否真的存在。
即便文件存在,但 PHP 所在的进程用户没有读取权限,也会导致 md5_file() 失败。
示例:
<code> chmod('/path/to/file.txt', 0000); // 禁用所有权限 $hash = md5_file('/path/to/file.txt'); // 返回 false </code>排查建议:
使用 is_readable() 检查文件是否具备读取权限。
在 Windows 系统中,如果某些程序正在独占访问文件,PHP 可能无法读取文件内容,也会导致返回 false。
排查建议:
尝试复制该文件至其他位置再用 md5_file() 读取,或用其他工具检查是否被锁定。
虽然 md5_file() 使用的是流式读取方式(不会一次性加载全部文件进内存),但如果 PHP 配置中 memory_limit 过低,也可能在读取大文件时失败。
排查建议:
适当提高 memory_limit 设置,或使用命令行脚本执行(通常限制更宽松)。
md5_file() 支持通过 URL 读取远程文件,例如:
<code> $hash = md5_file('http://m66.net/files/sample.txt'); </code>但是,只有在 php.ini 中启用了 allow_url_fopen 的前提下,这样的调用才会成功。如果未启用该选项,返回值就是 false。
排查建议:
检查配置文件或通过代码确认:
该函数可以输出最后一个运行时错误的详细信息,对于排查异常非常有帮助。
建议将错误信息写入日志,方便后期追踪:
<code> if (($hash = md5_file($filepath)) === false) { error_log('md5_file 失败: ' . print_r(error_get_last(), true)); } </code>有时候文件本身并无问题,但因为路径拼接或变量污染导致路径错误。你可以用 fopen() 试试看:
<code> if (!$handle = @fopen($filepath, 'rb')) { echo '文件打开失败'; } </code>