获取非常大的文件的MD5校验和

时间:2010-07-18 23:57:21

标签: php hash md5 checksum

我编写了一个脚本,它读取目录中的所有文件,并为每个文件返回md5哈希值。但是,它不会为相当大的文件呈现任何内容。我假设解释器为最大处理时间设置了一些值,并且由于获取此值需要很长时间,因此它只是跳到其他文件。无论如何通过PHP获取大文件的md5校验和?如果没有,是否可以通过cpanel的chron工作完成?我在那里试了一下,但似乎我的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);
        }
    }
}

5 个答案:

答案 0 :(得分:9)

如果您决定使用shell_exec()或system()调用,请确保使用escapeshellarg(http://us3.php.net/manual/en/function.escapeshellarg.php)。即,

shell_exec('md5sum -b ' . escapeshellarg($filename));

答案 1 :(得分:3)

虽然我无法使用带有2GB文件的PHP 5.2或5.3重现它,但问题似乎出现在32位PHP版本上。

即使如此,你也可以试着让系统进入哈希,这不是一个非常好的解决方案

echo system("md5sum test.txt");
  

46d6a7bcbcf7ae0501da341cb3bae27c test.txt

答案 2 :(得分:2)

如果您达到执行时间限制或最长执行时间,PHP应该抛出一条错误消息。检查错误日志。如果达到限制,可以在php.ini文件中设置PHP内存使用和执行时间的最大值:

memory_limit = 16M 

将最大内存使用量设置为16兆。为了最大化执行时间:

max_execution_time = 30

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

答案 3 :(得分:2)

您可以使用命令行

来实现它
 shell_exec('md5sum -b '. $fileName);

答案 4 :(得分:2)

仅供参考....如果有人需要快速的md5()支票金额。即使文件较大,PHP也非常快。这将在3秒内返回Linux Mint .iso(大小为880MB)的校验和。

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