2010-07-16 17 views
6

estoy tratando de descomprimir un archivo de 14 MB con PHP con código como el siguiente:descomprimir archivos más grandes con PHP

$zip = zip_open("c:\kosmas.zip"); 
    while ($zip_entry = zip_read($zip)) { 
    $fp = fopen("c:/unzip/import.xml", "w"); 
    if (zip_entry_open($zip, $zip_entry, "r")) { 
    $buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)); 
    fwrite($fp,"$buf"); 
    zip_entry_close($zip_entry); 
    fclose($fp); 
    break; 
    } 
    zip_close($zip); 
    } 

Se produce un error en mi localhost con el límite de 128 MB de memoria con el clásico "Allowed memory size of blablabla bytes exhausted". En el servidor, tengo un límite de 16 MB, ¿hay una mejor manera de hacerlo para que yo pueda encajar en este límite? No veo por qué esto tiene que asignar más de 128 MB de memoria. Gracias por adelantado.

Solución: empecé a leer los archivos en fragmentos de 10 kb, que resuelve un problema con la memoria pico de uso arnoud 1,5 MB.

 $filename = 'c:\kosmas.zip'; 
     $archive = zip_open($filename); 
     while($entry = zip_read($archive)){ 
      $size = zip_entry_filesize($entry); 
      $name = zip_entry_name($entry); 
      $unzipped = fopen('c:/unzip/'.$name,'wb'); 
      while($size > 0){ 
       $chunkSize = ($size > 10240) ? 10240 : $size; 
       $size -= $chunkSize; 
       $chunk = zip_entry_read($entry, $chunkSize); 
       if($chunk !== false) fwrite($unzipped, $chunk); 
      } 

      fclose($unzipped); 
     } 
+0

¿Cuál es el tamaño * descomprimido * del archivo comprimido? –

+0

¿Está utilizando las herramientas de línea de comando una opción? –

+0

El tamaño sin comprimir es de aproximadamente 110 MB. Desafortunadamente, usar la línea de comando no es una opción. – cypher

Respuesta

4

¿Por qué lee todo el archivo a la vez?

$buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)); 
fwrite($fp,"$buf"); 

Intenta leer pequeños trozos y escribirlos en un archivo.

+0

Eso es exactamente lo que hice y voy a publicar la solución en un minuto, si alguien está interesado. – cypher

1

El hecho de que una cremallera es menor que el límite de memoria de PHP & quizás el descomprimido es así, no tiene en cuenta los gastos generales de PHP en general, y lo más importante la memoria necesaria para realmente descomprimir el archivo, que mientras yo' No soy experto en compresión, espero que sea mucho más que el tamaño final descomprimido.

+0

Sí, pero siempre parece haber una alternativa, es decir, puedo descomprimir archivos mucho más grandes con un uso máximo de memoria inferior a 1 MB, puedo analizar un archivo de 1,5GB xml con un uso máximo de memoria inferior a 3 MB, ¿por qué no podría haber tal alternativa? para archivos zip ... – cypher

0

Para un archivo de ese tamaño, tal vez es mejor si se utiliza shell_exec() lugar:

shell_exec('unzip archive.zip -d /destination_path'); 

PHP debe no estar ejecutándose en modo seguro y debe tener acceso tanto a shell_exec y descomprimir para este método para trabajar.

actualización:

Dado que las herramientas de línea de comandos no están disponibles, todo lo que puedo pensar es crear un guión y enviar el archivo a un servidor remoto donde las herramientas de línea de comandos son disponibles, extraer el archive y descargue los contenidos.

+0

Desafortunadamente, las herramientas de línea de comando están deshabilitadas por el servidor. – cypher

+0

@Anax esta es la razón por la cual PHP tiene un mal ajuste. ¿Por qué una aplicación de producción alguna vez necesita ejecutar args de línea de comando? Esta es la fuente principal de tantos gusanos PHP. –

0
function my_unzip($full_pathname){ 

    $unzipped_content = ''; 
    $zd = gzopen($full_pathname, "r"); 

    while ($zip_file = gzread($zd, 10000000)){ 
     $unzipped_content.= $zip_file; 
    } 

    gzclose($zd); 

    return $unzipped_content; 

} 
+1

Cualquier explicación o razonamiento detrás de esta solución podría ser útil para comprender el problema. – PiotrWolkowski

+0

Además, esto ha sido respondido ** 4 ** años atrás. – cypher

Cuestiones relacionadas