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