获取大文件的MD5校验和

8
我已经编写了一个脚本,可以读取目录中的所有文件并返回每个文件的md5哈希值。但是,对于某些较大的文件,它不会返回任何结果。我认为解释器设置了最大处理时间的某个值,由于获取这个值需要太长时间,因此它只是跳过其他文件。是否有办法通过PHP获取大文件的md5校验和?如果不能,是否可以通过cpanel的计划任务完成?我在那里试过了,但似乎我的md5sum命令从未被处理:我从未收到包含哈希的电子邮件。以下是我已经编写的PHP代码。它是一个非常简单的代码,并且适用于合理大小的文件:
function md5_dir($dir) {
    if (is_dir($dir)) {
        if ($dh = opendir($dir)) {
            while (($file = readdir($dh)) !== false) {
                echo nl2br($file . "\n" . md5_file($file) . "\n\n");
            }
            closedir($dh);
        }
    }
}

什么是“相当大的文件”?文件大小是多少? - Mike Sherov
旁注:MD5不是校验和,而是哈希。此外,它也不安全。 - Steven Sudit
我愚蠢地认为md5工具输出的是md5校验和。XD 我正在尝试处理一个1G的文件。 - fny
Faraz,我在这里说的是MD5是一种哈希,因此MD5工具会输出一个MD5哈希值。校验和是另一回事。 - Steven Sudit
我明白。我打算将此PHP MD5输出的结果与我计算机上的md5sum输出进行比较,如果我没有弄错的话,它们将不会返回相同的值。 - fny
5个回答

9

3

虽然我无法在使用2GB文件的PHP 5.2或5.3中重现此问题,但该问题似乎出现在32位PHP构建中。

即使如此,这并不是一个非常好的解决方案,您可以尝试让系统进行哈希处理。

echo system("md5sum test.txt");

46d6a7bcbcf7ae0501da341cb3bae27c test.txt


当我运行这个程序时,什么也没有发生。 - fny
我假设你正在运行Linux?你尝试在控制台上运行它并查看是否可以正常工作吗?(如果不能,也许错误信息会帮助你 :/ ) - edorian
1
我在FreeBSD机器上运行脚本,因此没有GNU md5sum。感谢您的提示。 ;) - fny

2
如果您遇到执行时间限制或最大执行时间问题,PHP应该会抛出相应的错误信息。请检查您的错误日志。如果您遇到了限制,您可以在php.ini文件中设置PHP内存使用和执行时间的最大值:
memory_limit = 16M 

将最大内存使用量设置为16兆字节。对于最大执行时间:

max_execution_time = 30

将最大执行时间设置为30秒。


[function.md5-file]:无法打开流:值超出了定义的数据类型。 - fny

2

供参考...如果有人需要快速的md5()校验和。PHP即使处理大文件也相当快。此代码在Linux Mint .iso文件(大小为880MB)上返回校验和仅需3秒。

<?php
// checksum
$path = $_SERVER['DOCUMENT_ROOT']; // get upload folder path
$file = $path."/somefolder/linux-mint.iso";  // any file
echo md5_file($file);
?>

2
你可以通过命令行实现它。
 shell_exec('md5sum -b '. $fileName);

你们能否在踩掉解决方案时留下评论呢?正如faraz.yashar的评论所述,PHP解决方案在大量数据上无法工作,而md5sum命令行可以。作者表示他可以注册cron作业,我认为他也可以使用PHP运行shell命令。 - Benoit
我自己已经点赞了,但我认为负评是因为没有解释(例如对于-b参数... - Obmerk Kronen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接