Php 获取非常大文件的MD5校验和
我编写了一个脚本,它读取目录中的所有文件,并为每个文件返回md5哈希。但是,对于相当大的文件,它不会呈现任何内容。我假设解释器为最大处理时间设置了一些值,并且由于获取该值花费的时间太长,它只会跳转到其他文件。是否仍然可以通过PHP获取大型文件的md5校验和?如果没有,可以通过与cpanel的计时作业来完成吗?我在那里尝试了一下,但我的md5sum命令似乎从未被处理过:我从未收到过带有散列的电子邮件。这是我已经编写的PHP。这是一个非常简单的代码,适用于大小合理的文件:Php 获取非常大文件的MD5校验和,php,hash,md5,checksum,Php,Hash,Md5,Checksum,我编写了一个脚本,它读取目录中的所有文件,并为每个文件返回md5哈希。但是,对于相当大的文件,它不会呈现任何内容。我假设解释器为最大处理时间设置了一些值,并且由于获取该值花费的时间太长,它只会跳转到其他文件。是否仍然可以通过PHP获取大型文件的md5校验和?如果没有,可以通过与cpanel的计时作业来完成吗?我在那里尝试了一下,但我的md5sum命令似乎从未被处理过:我从未收到过带有散列的电子邮件。这是我已经编写的PHP。这是一个非常简单的代码,适用于大小合理的文件: function md5_
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机器上运行这个脚本;因此,没有GNUmd5sum
。谢谢你的提示当你们对解决方案投否决票时,你们有可能留下评论吗?正如faraz.yashar评论中所述,php解决方案不能处理大量数据,md5sum命令行可以。作者说他可以注册cron作业,我想他也可以用php运行shell命令。我自己也投了赞成票,但我认为投反对票是因为没有解释(例如,“-b”参数)。。