2010-07-18 28 views
8

Ich habe ein Skript geschrieben, das durch alle Dateien in einem Verzeichnis liest und MD5-Hash für jede Datei zurückgibt. Es macht jedoch nichts für eine ziemlich große Datei. Ich nehme an, dass der Interpreter einen Wert für die maximale Verarbeitungszeit hat, und da es zu lange dauert, um diesen Wert zu erhalten, springt er einfach zu anderen Dateien. Gibt es trotzdem eine MD5-Prüfsumme für große Dateien über PHP? Wenn nicht, könnte es durch einen Chron-Job mit cpanel getan werden? Ich habe es dort versucht, aber es scheint nicht, dass mein Befehl md5sum jemals verarbeitet wurde: Ich bekomme nie eine E-Mail mit dem Hash. Hier ist das PHP, das ich bereits geschrieben habe. Es ist ein sehr einfacher Code und arbeitet Datei für Dateien eine vernünftige Größe:Get MD5 Checksum für sehr große Dateien

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

Was ist "eine ziemlich große Datei"? Wie groß ist die Dateigröße? –

+0

Randnotiz: MD5 ist keine Prüfsumme, es ist ein Hash. Außerdem ist es nicht sicher. –

+0

Ich nahm törichterweise an, dass das md5-Tool die md5-Prüfsumme ausgibt. XD Ich versuche eine 1-Gig-Datei zu machen. – fny

Antwort

3

Während ich es nicht mit PHP 5.2 oder 5.3 mit einer 2GB Datei reproduzieren konnte, scheint das Problem auf 32bit PHP Builds zu kommen.

Auch so ist es nicht eine sehr schöne Lösung, die Sie könnten versuchen, das System auf die Häsing zu lassen

echo system("md5sum test.txt"); 

46d6a7bcbcf7ae0501da341cb3bae27c test.txt

+0

Es passiert nichts, wenn ich dies ausführe. – fny

+0

Ich nehme an, dass Sie Linux ausführen? Hast du es auf der Konsole versucht und sehen, ob es dort funktioniert? (Und wenn nicht vielleicht der Fehler wird Ihnen helfen: /) – edorian

+1

Ich habe das Skript auf einem FreeBSD-Rechner ausgeführt; daher kein GNU 'md5sum'. Danke für den Tipp. ;) – fny

2

Wenn Sie eine maximale Ausführungszeit oder maximale Ausführungszeit treffen sind, sollte PHP eine Fehlermeldung in diesem Sinne Urteile werfen. Überprüfen Sie Ihre Fehlerprotokolle. Wenn Sie eine Grenze schlagen, können Sie die Maximalwerte für PHP Speichernutzung und Ausführungszeit in der php.ini-Datei festgelegt:

memory_limit = 16M 

max Speicherauslastung auf 16 MB festgelegt werden. Für die maximale Ausführungszeit:

max_execution_time = 30 

wird die maximale Ausführungszeit auf 30 Sekunden eingestellt.

+0

[function.md5-file]: Stream konnte nicht geöffnet werden: Wert zu groß für den definierten Datentyp – fny

2

Sie es mit Kommandozeile erreichen könnte

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

Ist es für euch möglich, Kommentare zu hinterlassen, wenn ihr Lösungen herunterlädt? wie in Faraz angegeben.Kommentar von Yashar Die PHP-Lösung funktionierte nicht auf einer großen Datenmenge, die md5sum-Befehlszeile tut dies. Der Autor sagt, er kann Cron-Jobs registrieren, ich nehme an, er kann auch Shell-Befehle mit PHP ausführen. – Benoit

+0

Ich selbst habe upvoted, aber ich nehme an, dass der Downvote war, weil es keine Erklärung gab (zum Beispiel für den Parameter "-b" .. –

9

Stellen Sie sicher, escapeshellarg () zu verwenden), wenn Sie sich für einen Aufruf von shell_exec() oder system() entscheiden. Ie,

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

FYI ... falls jemand eine schnelle md5() Prüfsumme benötigt. PHP ist ziemlich schnell sogar mit den größeren Dateien. Dies gibt die Checksumme auf Linux Mint .iso (Größe 880 MB) in 3 Sekunden zurück.

<?php 
// checksum 
$path = $_SERVER['DOCUMENT_ROOT']; // get upload folder path 
$file = $path."/somefolder/linux-mint.iso"; // any file 
echo md5_file($file); 
?>