Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 获取非常大文件的MD5校验和_Php_Hash_Md5_Checksum - Fatal编程技术网

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

Php 获取非常大文件的MD5校验和,php,hash,md5,checksum,Php,Hash,Md5,Checksum,我编写了一个脚本,它读取目录中的所有文件,并为每个文件返回md5哈希。但是,对于相当大的文件,它不会呈现任何内容。我假设解释器为最大处理时间设置了一些值,并且由于获取该值花费的时间太长,它只会跳转到其他文件。是否仍然可以通过PHP获取大型文件的md5校验和?如果没有,可以通过与cpanel的计时作业来完成吗?我在那里尝试了一下,但我的md5sum命令似乎从未被处理过:我从未收到过带有散列的电子邮件。这是我已经编写的PHP。这是一个非常简单的代码,适用于大小合理的文件: function md5_

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

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

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

max_execution_time = 30

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

虽然我无法用2GB文件用PHP5.2或5.3复制它,但问题似乎出现在32位PHP版本上

即使如此,这也不是一个很好的解决方案,你可以试着让系统恢复正常

echo system("md5sum test.txt");
46D6A7BCF7AE0501DA341CB37C测试.txt


您可以使用命令行实现它

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

如果决定使用shell_exec()或system()调用,请确保使用escapeshellarg()。即

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

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


什么是“相当大的文件”?文件大小是多少?旁注:MD5不是校验和,它是散列。而且,它也不安全。我愚蠢地假设md5工具输出md5校验和。XD我想做一个1G的file.faraz,我在这里说的是MD5是一个散列,所以MD5工具输出一个MD5散列值。校验和是另外一回事,我明白。我打算将这个PHP MD5输出的结果与我计算机上的md5sum输出进行比较,如果我没有弄错的话,它不会返回相同的值。[function.MD5 file]:无法打开流:值对于定义的数据类型来说太大运行时不会发生任何情况。我假设您正在运行Linux?你有没有在控制台上试过,看看它是否能正常工作?(如果不是的话,这个错误可能会帮助你:/)我在FreeBSD机器上运行这个脚本;因此,没有GNU
md5sum
。谢谢你的提示当你们对解决方案投否决票时,你们有可能留下评论吗?正如faraz.yashar评论中所述,php解决方案不能处理大量数据,md5sum命令行可以。作者说他可以注册cron作业,我想他也可以用php运行shell命令。我自己也投了赞成票,但我认为投反对票是因为没有解释(例如,“-b”参数)。。