2010-07-18 9 views
8

J'ai écrit un script qui lit tous les fichiers d'un répertoire et renvoie le hachage md5 pour chaque fichier. Cependant, il ne rend rien pour un fichier assez volumineux. Je suppose que l'interpréteur a une certaine valeur définie pour un temps de traitement maximal, et comme cela prend trop de temps pour obtenir cette valeur, il passe juste à d'autres fichiers. Est-il possible d'obtenir une somme de contrôle md5 pour les fichiers volumineux via PHP? Si non, pourrait-il être fait à travers un travail chron avec cpanel? J'ai donné un coup de feu là-bas mais il ne semble pas que ma commande md5sum ait jamais été traitée: je n'ai jamais reçu d'email avec le hash. Voici le PHP que j'ai déjà écrit. Il est un code très simple et fonctionne pour les fichiers d'une taille raisonnable:Récupération de la somme de contrôle MD5 pour les fichiers très volumineux

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

Qu'est-ce que c'est «un fichier plutôt volumineux»? Quelle est la taille du fichier? –

+0

Note: MD5 n'est pas une somme de contrôle, c'est un hachage. De plus, ce n'est pas sécurisé. –

+0

J'ai bêtement supposé que l'outil md5 produisait la somme de contrôle md5. XD J'essaye de faire un fichier de 1 gig. – fny

Répondre

3

Bien que je ne puisse pas le reproduire avec PHP 5.2 ou 5.3 avec un fichier de 2 Go, le problème semble se poser sur les versions PHP 32 bits.

Même si ce n'est pas une solution vraiment sympa, vous pouvez essayer de laisser le système au hasing

echo system("md5sum test.txt"); 

46d6a7bcbcf7ae0501da341cb3bae27c test.txt

+0

Rien ne se passe lorsque je l'exécute. – fny

+0

Je suppose que vous utilisez Linux? Avez-vous essayé sur la console et voir si cela fonctionne? (Et si ce n'est pas le cas, l'erreur vous aidera: /) – edorian

+1

Je courais le script sur une machine FreeBSD; par conséquent, pas GNU 'md5sum'. Merci pour le conseil. ;) – fny

2

Si vous touchez une limite de temps d'exécution ou le temps d'exécution maximum, PHP devrait être jeter un message d'erreur à cet effet. Vérifiez vos journaux d'erreurs. Si vous frappez une limite, vous pouvez définir les valeurs maximales pour l'utilisation de la mémoire PHP et le temps d'exécution dans votre fichier php.ini:

memory_limit = 16M 

sera mis en utilisation de la mémoire max 16 megs. Pour une durée d'exécution maximale:

max_execution_time = 30 

définit la durée d'exécution maximale à 30 secondes.

+0

[fichier fonction.md5]: échec de l'ouverture du flux: valeur trop grande pour le type de données défini – fny

2

vous pouvez le réaliser avec la ligne de commande

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

Est-il possible pour vous les gars de laisser des commentaires lorsque vous downvote sur des solutions? comme indiqué à Faraz.Commentaires yashar la solution php n'a pas fonctionné sur une grande quantité de données, ligne de commande md5sum fait. L'auteur dit qu'il peut enregistrer des tâches cron, je suppose qu'il peut également exécuter des commandes shell avec php. – Benoit

+0

J'ai moi-même upvoted, mais je suppose que le downvote était parce qu'il n'y avait pas d'explication (par exemple pour le paramètre '-b' .. –

2

Pour votre information .... au cas où quelqu'un a besoin d'une somme de contrôle md5 rapide(). PHP est assez rapide même avec les fichiers plus volumineux. Cela retourne la somme de contrôle sur Linux Mint .iso (taille 880MB) en 3 sec.

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