2010-07-18 2 views
8

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

Что такое "довольно большой файл"? Каков размер файла? –

+0

Сторона примечания: MD5 не является контрольной суммой, это хэш. Кроме того, это не безопасно. –

+0

Я по глупости предположил, что инструмент md5 выводит контрольную сумму md5. XD Я пытаюсь сделать файл с 1 гигабайтом. – fny

ответ

3

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

Даже так что это не очень хорошее решение, вы можете попробовать, чтобы система в hasing

echo system("md5sum test.txt"); 

46d6a7bcbcf7ae0501da341cb3bae27c test.txt

+0

Ничего не происходит, когда я запускаю это. – fny

+0

Предполагаю, что вы используете Linux? Вы попробовали его на консоли и посмотреть, работает ли он там? (И если, возможно, ошибка вам поможет: /) – edorian

+1

Я запускал сценарий на машине FreeBSD; следовательно, нет GNU 'md5sum'. Спасибо за совет. ;) – fny

2

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

memory_limit = 16M 

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

max_execution_time = 30 

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

+0

[function.md5-file]: не удалось открыть поток: слишком большое значение для определенного типа данных – fny

2

вы могли бы достичь его с командной строки

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

Возможно ли, что вы, ребята, оставляете комментарии, когда используете downvote на решениях? как указано в faraz.yashar комментирует, что решение php не работает на большом количестве данных, в командной строке md5sum. Автор говорит, что он может регистрировать задания cron, я предполагаю, что он также может запускать команды оболочки с php. – Benoit

+0

Я сам обойден, но я полагаю, что нисходящее было потому, что не было объяснений (например, для параметра '-b' .. –

9

Обязательно используйте escapeshellarg ()), если вы решите использовать вызов shell_exec() или system(). I.e.,

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

FYI .... в случае, если кому-то нужна быстрая контрольная сумма 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); 
?> 
Смежные вопросы