2010-07-16 3 views
6

Je suis en train de décompresser une archive 14Mo avec PHP avec le code comme ceci:fichiers PHP plus grandes avec Dézippage

$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); 
    } 

Il échoue sur mon localhost avec la limite de 128 Mo de mémoire avec le classique « Allowed memory size of blablabla bytes exhausted ». Sur le serveur, j'ai une limite de 16 Mo, y a-t-il une meilleure façon de le faire pour que je puisse tenir dans cette limite? Je ne vois pas pourquoi cela doit allouer plus de 128 Mo de mémoire. Merci d'avance.

Solution: J'ai commencé à lire les fichiers en morceaux 10KB, problème résolu avec utilisation de la mémoire de pointe Arnoud 1.5MB.

 $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

Quelle est la taille * non compressée du fichier zip? –

+0

L'utilisation d'outils de ligne de commande est-elle une option? –

+0

La taille non compressée est d'environ 110 Mo. Malheureusement, l'utilisation de la ligne de commande n'est pas une option. – cypher

Répondre

4

Pourquoi lisez-vous tout le fichier en même temps? Essayez de lire des petits morceaux de celui-ci et de les écrire dans un fichier.

+0

C'est exactement ce que j'ai fait et je vais poster la solution dans une minute, si quelqu'un est intéressé. – cypher

1

Juste parce qu'un zip est inférieure à la limite de mémoire de PHP & peut-être le décompressé est aussi bien, ne tient pas compte des frais généraux de PHP en général, et plus important encore la mémoire nécessaire pour réellement décompressez le fichier, qui, bien que je Je ne suis pas expert en matière de compression, je m'attendrais peut-être bien plus que la taille finale décompressée.

+0

Oui, mais il semble toujours y avoir une alternative, à savoir je peux décompresser des archives beaucoup plus volumineuses avec moins de 1 Mo d'espace mémoire, je peux analyser 1,5 Go de fichier xml avec une mémoire de moins de 3 Mo pour les fichiers zip ... – cypher

0

Pour un fichier de cette taille, peut-être il est préférable si vous utilisez shell_exec() à la place:

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

PHP doit pas être en cours d'exécution en mode sans échec et vous devez avoir accès à la fois shell_exec et décompressez pour cette méthode de travail.

Mise à jour:

Étant donné que les outils de ligne de commande ne sont pas disponibles, tout ce que je peux penser est de créer un script et d'envoyer le fichier à un serveur distant où les outils de ligne de commande sont disponibles, extraire le fichier et télécharger le contenu.

+0

Malheureusement, les outils de ligne de commande sont désactivés par le serveur. – cypher

+0

@Anax c'est pourquoi PHP obtient un mauvais tour. Pourquoi une application de production doit-elle jamais exécuter des arguments en ligne de commande? C'est la principale source de tant de vers 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

Toute explication ou tout raisonnement derrière cette solution pourrait être utile pour comprendre le problème. – PiotrWolkowski

+0

En outre, cela a été répondu ** 4 ** ans. – cypher

Questions connexes