zip lib: memory exceeded sur les gros fichiers zip

zip lib: memory exceeded sur les gros fichiers zip - PHP - Programmation

Marsh Posté le 08-01-2010 à 01:34:00    

Hello
 
J'ai un petit soucis, j'utilise la lib zip pour créer mes fichiers zip en PHP, cela marche mais au delà d'une certaine taille il me renvoie une erreur:

Code :
  1. <br />
  2. <b>Fatal error</b>:  Out of memory (allocated 678166528) (tried to allocate 221121457 bytes) in <b>C:\Program Files\xampp\phpMyAdmin\libraries\zip.lib.php</b> on line <b>183</b><br />


 
Pourtant dans php.ini j'ai mis memory_limit à 1000M et j'ai mis le max_execution_time à 600.
Quand je lance la création du fichier ZIP, je vois le processus httpd.exe consommer de plus en plus de ressources (jusqu'à 650Mo environ) puis il s'arrête sur cette erreur.
L'ensemble des fichiers à zipper fait 212Mo.
Voici mon code:
 

Code :
  1. require_once("zip.lib.php" ) ;
  2. $zip = new zipfile() ; //on crée un fichier zip
  3. // on liste tous les fichiers et on les ajoute au tableau $filename
  4. if ($dir = @opendir($mydir.$_GET['download']))
  5.  {
  6.  $filename = array() ;
  7.  while (($file = readdir($dir)) !== false)
  8.  {
  9. // on ajoute seulement les fichiers, pas les répertoires
  10.   if($file != ".." && $file != "." && !is_dir($mydir.$_GET['download'].$file))
  11.    array_push($filename,$file);
  12.  }
  13. }
  14. // Pour tous les fichiers dans le tableau, on lit leur contenu et on l'ajoute au fichier ZIP
  15. $a = 0 ;
  16. while(count($filename)>$a)
  17. {
  18.  $zip->addFile(file_get_contents($mydir.$_GET['download'].$filename[$a]), $filename[$a]) ; //on ajoute le fichier
  19.  $a++;
  20. }
  21. // on propose de télécharger ce fichier
  22. header("Content-type: application/octet-stream" );
  23. $aa=explode("/",$_GET['download'])    ;
  24. header("Content-disposition: attachment; filename=\"".$aa[sizeof($aa)-2].".zip\";" );
  25. echo $zip-> file();


 
Je sais pas trop quoi faire  :(


Message édité par sue soeur debeat le 08-01-2010 à 01:36:04
Reply

Marsh Posté le 08-01-2010 à 01:34:00   

Reply

Marsh Posté le 08-01-2010 à 09:24:35    

Je connais pas du tout cette lib, mais existe-t-il un mode de fonctionnement de cette lib qui ne crée pas un flux en mémoire, mais directement sur le disque ?
 
Dans ce cas, je ferais de cette façon (et d'ailleurs, par précaution, je te conseille de toujours faire comme ça) : tu zip tout dans un fichier temporaire sur le disque, puis tu envoies le fichier.
 
Ca devrait éviter de bouffer inutilement toute la mémoire.

Reply

Marsh Posté le 08-01-2010 à 09:44:08    

utilise l'extention de php  http://www.php.net/manual/fr/book.zip.php
(si tu peu bien sur )
 
je probleme aussi c'est que dans ta fonction tu lit le contenu du fichier
$zip->addFile(file_get_contents())
 
regarde si dans la doc de ta lib, si tu peu mettre le chemin du fichier plutôt (comme l'extension php)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed