Получить контрольную сумму MD5 для очень больших файлов - PullRequest
8 голосов
/ 19 июля 2010

Я написал скрипт, который читает все файлы в каталоге и возвращает хэш md5 для каждого файла. Тем не менее, это ничего не делает для довольно большого файла. Я предполагаю, что интерпретатор имеет какое-то значение, установленное для максимального времени обработки, и, поскольку получение этого значения занимает слишком много времени, он просто пропускает другие файлы. Есть ли способ получить контрольную сумму md5 для больших файлов через PHP? Если нет, то можно ли это сделать с помощью 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);
        }
    }
}

Ответы [ 5 ]

9 голосов
/ 20 июля 2010

Обязательно используйте escapeshellarg (http://us3.php.net/manual/en/function.escapeshellarg.php), если вы решите использовать вызов shell_exec () или system (). То есть.,

shell_exec('md5sum -b ' . escapeshellarg($filename));
3 голосов
/ 19 июля 2010

Хотя я не мог воспроизвести его с помощью PHP 5.2 или 5.3 с файлом объемом 2 ГБ, проблема, похоже, возникает при 32-битных сборках PHP.

Несмотря на то, что это не очень хорошее решение, вы можете попробоватьсистема на взлом

echo system("md5sum test.txt");

46d6a7bcbcf7ae0501da341cb3bae27c test.txt

2 голосов
/ 11 апреля 2013

К вашему сведению .... если кому-то нужна быстрая контрольная сумма md5 (). PHP работает довольно быстро даже с большими файлами. Это возвращает контрольную сумму в Linux Mint .iso (размер 880 МБ) за 3 секунды.

<?php
// checksum
$path = $_SERVER['DOCUMENT_ROOT']; // get upload folder path
$file = $path."/somefolder/linux-mint.iso";  // any file
echo md5_file($file);
?>
2 голосов
/ 19 июля 2010

вы можете достичь этого с помощью командной строки

 shell_exec('md5sum -b '. $fileName);
2 голосов
/ 19 июля 2010

Если вы устанавливаете ограничение по времени выполнения или максимальное время выполнения, PHP должен выдавать сообщение об ошибке на этот счет. Проверьте ваши журналы ошибок. Если вы превышаете лимит, вы можете установить максимальные значения для использования памяти PHP и времени выполнения в файле php.ini:

memory_limit = 16M 

установит максимальное использование памяти в 16 мегабайт. Для максимального времени выполнения:

max_execution_time = 30

установит максимальное время выполнения 30 секунд.

...