【问题标题】:Get MD5 Checksum for Very Large Files获取超大文件的 MD5 校验和
【发布时间】:2023-04-03 13:22:01
【问题描述】:

我编写了一个脚本,它读取目录中的所有文件并返回每个文件的 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);
        }
    }
}

【问题讨论】:

  • 什么是“相当大的文件”?文件大小是多少?
  • 旁注:MD5 不是校验和,而是哈希。而且,它也不安全。
  • 我愚蠢地假设 md5 工具输出 md5 校验和。 XD 我正在尝试制作一个 1 gig 文件。
  • 法拉兹,我这里说的是MD5是一个哈希值,所以一个MD5工具输出一个MD5哈希值。校验和是另一回事。
  • 我明白了。我打算将此 PHP MD5 输出的结果与我计算机上的 md5sum 输出进行比较,如果我没记错的话,它不会返回相同的值。

标签: php hash md5 checksum


【解决方案1】:

仅供参考....以防有人需要快速的 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);
?>

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      你可以用命令行来实现它

       shell_exec('md5sum -b '. $fileName);
      

      【讨论】:

      • 当您对解决方案投反对票时,你们有可能离开 cmets 吗?如 faraz.yashar 评论中所述,php 解决方案不适用于大量数据,md5sum 命令行可以。作者说他可以注册cron作业,我假设他也可以用php运行shell命令。
      • 我自己投了赞成票,但我认为投反对票是因为没有解释(例如对于`-b`参数..
      【解决方案4】:

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

      即便如此,这也不是一个很好的解决方案,您可以尝试让系统拥有优势

      echo system("md5sum test.txt");
      

      46d6a7bcbcf7ae0501da341cb3bae27c test.txt

      【讨论】:

      • 当我运行这个时没有任何反应。
      • 我假设您正在运行 Linux ?您是否在控制台上尝试过,看看它是否在那里工作? (如果不是,错误可能会对您有所帮助:/)
      • 我在 FreeBSD 机器上运行脚本;因此,没有 GNU md5sum。谢谢你的提示。 ;)
      【解决方案5】:

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

      memory_limit = 16M 
      

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

      max_execution_time = 30
      

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

      【讨论】:

      • [function.md5-file]:无法打开流:值对于定义的数据类型来说太大
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-13
      相关资源
      最近更新 更多