2010-07-18 13 views
8

He escrito una secuencia de comandos que lee todos los archivos en un directorio y devuelve md5 hash para cada archivo. Sin embargo, no representa nada para un archivo bastante grande. Supongo que el intérprete tiene algún valor establecido para el tiempo máximo de procesamiento, y como lleva demasiado tiempo obtener este valor, simplemente se salta a otros archivos. ¿Hay alguna forma de obtener una suma de comprobación md5 para archivos grandes a través de PHP? Si no, ¿podría hacerse a través de un trabajo crón con cpanel? Le di una oportunidad, pero parece que mi comando md5sum nunca se ha procesado: nunca recibo un correo electrónico con el hash. Aquí está el PHP que ya escribí. Es un código muy simple y funciona archivo para los archivos de un tamaño razonable:Obtener suma de comprobación MD5 para archivos muy grandes

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é es "un archivo más grande"? ¿Cuál es el tamaño del archivo? –

+0

Nota al margen: MD5 no es una suma de comprobación, es un hash. Además, no es seguro. –

+0

I tontamente supuso que la herramienta md5 genera la suma de comprobación md5. XD Estoy tratando de hacer un archivo de 1 gig. – fny

Respuesta

3

Si bien no pude reproducirlo con PHP 5.2 o 5.3 con un archivo de 2GB, parece que el problema aparece en las compilaciones de PHP de 32 bits.

Incluso así que no es una solución muy agradable usted podría tratar de dejar que el sistema a la Hasing

echo system("md5sum test.txt"); 

test.txt 46d6a7bcbcf7ae0501da341cb3bae27c

+0

No sucede nada cuando ejecuto esto. – fny

+0

Supongo que estás ejecutando Linux? ¿Lo probaste en la consola y ves si funciona allí? (Y si no, tal vez el error te ayudará: /) – edorian

+1

Estaba ejecutando el script en una máquina FreeBSD; por lo tanto, no GNU 'md5sum'. Gracias por el consejo. ;) – fny

2

Si se lanzó un límite de tiempo de ejecución o el tiempo máximo de ejecución, PHP debe estar lanzando un mensaje de error a tal efecto. Verifique sus registros de errores. Si usted está golpeando un límite, puede establecer los valores máximos para el uso de memoria y tiempo de ejecución de PHP en su archivo php.ini:

memory_limit = 16M 

establecerá el uso de memoria máximo de 16 megas. Para un tiempo máximo de ejecución:

max_execution_time = 30 

se establecerá un tiempo máximo de ejecución de 30 segundos.

+0

[archivo.md5-función]: error al abrir la secuencia: valor demasiado grande para el tipo de datos definido – fny

2

que podría lograr con la línea de comandos

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

¿Es posible que ustedes dejen comentarios cuando desestimen las soluciones? como se indica en faraz.Yashar comenta que la solución php no funcionó en una gran cantidad de datos, la línea de comando md5sum sí lo hace. El autor dice que puede registrar tareas cron, supongo que también puede ejecutar comandos de shell con php. – Benoit

+0

Yo mismo he votado a favor, pero supongo que el voto a favor se debió a que no hubo explicación (por ejemplo, para el parámetro '-b' ... –

2

FYI .... en caso de que alguien necesite una suma de md5() rápida. PHP es bastante rápido incluso con los archivos más grandes. Esto devuelve la suma de verificación en Linux Mint .iso (tamaño 880MB) en 3 segundos.

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