problème de memory_limit

problème de memory_limit - PHP - Programmation

Marsh Posté le 25-05-2007 à 10:10:44    

Bonjour à tous,

 

Y-a-t-il moyen d'optimiser ce code pour éviter de me retrouver avec une erreur :
Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 4292304 bytes)

 

Pour info,

 

- ces fichiers à zipper font 600k
- le memory_limit de mon hébergeur est de 16Mo
- modifier le memory_limit avec ini_set n'est pas permis (ni via .htaccess)
- je n'ai pas les moyen de passer sur un dédié :-)

 

6 fichiers ça passe ... 7 ça coince et idéalement il m'en faudrait 12 :-\

 
Code :
  1. <?php
  2. require_once('inc/zip.lib.php');
  3. $tab_mp3 = array( '1.mp3','2.mp3','3.mp3','4.mp3','5.mp3','6.mp3' );
  4. $zip = new zipfile();
  5. $i = 1;
  6. foreach( $tab_mp3 as $value ){
  7.     $fp = fopen( 'mp3/' . $value,'r' );
  8.     $content = fread( $fp,filesize( 'mp3/' . $value ) );
  9.     fclose( $fp );
  10.     $zip->addfile( $content,$i . '_' . date( 'Ymd' ) . '.mp3' );
  11.     $i++;
  12. }
  13. $archive = $zip->file();
  14. header( 'Content-Type: application/x-zip' );
  15. header( 'Content-Disposition: inline; filename=mp3.zip' );
  16. echo $archive;
  17. ?>


Merci d'avance pour vos lumières :)

 

Reply

Marsh Posté le 25-05-2007 à 10:10:44   

Reply

Marsh Posté le 25-05-2007 à 10:48:11    

si ton hebergeur le permet, tu peux utiliser une commande externe
 
sinon au lieu de stocker $zip->file() dans une variable, fais un echo direct

echo $zip->file();

Reply

Marsh Posté le 25-05-2007 à 11:01:27    

soju a écrit :

si ton hebergeur le permet, tu peux utiliser une commande externe

 

sinon au lieu de stocker $zip->file() dans une variable, fais un echo direct

 

merci mais non ... il ne le permet pas, d'ailleurs il n'y en a pas beaucoup qui l'autorise non?

 


Reply

Marsh Posté le 19-06-2007 à 09:18:39    

:bounce:

Reply

Marsh Posté le 19-06-2007 à 09:53:13    

t'as essayé de faire le echo direct sans passer par une variable ?

Reply

Marsh Posté le 19-06-2007 à 17:14:43    

oui

 

ce que je ne comprends pas c'est pourquoi il m'indique que je n'utilise que 4292304 bytes alors que la limite est de
16777216 bytes ???

Message cité 1 fois
Message édité par zbang le 19-06-2007 à 17:18:06
Reply

Marsh Posté le 19-06-2007 à 17:22:45    

Non ça t'indique que l'erreur s'est produite au moment où tu as essayé d'allouer 4292304 bytes et que cette allocation a été refusée parcequ'elle te faisait dépasser la limite. Ca n'indique pas la quantité déjà allouée.


Message édité par cgo2 le 19-06-2007 à 17:23:08

---------------
When it's from Finland it's good.  - Mon blog
Reply

Marsh Posté le 19-06-2007 à 17:26:39    

t'as bien viré la ligne $archive = $zip->file(); ?
 

zbang a écrit :

4292304 bytes

c'est le nombre d'octets en trop (edit : grilled)
 
sinon c'est qui ton hebergeur ? chez ovh par exemple en mutualisé l'utilisation de commande externe est possible

Message cité 1 fois
Message édité par soju le 19-06-2007 à 17:27:29
Reply

Marsh Posté le 19-06-2007 à 17:29:01    

Sinon pour l'optimisation, le problème est que, visiblement, la lib zip que tu utilises garde tout en mémoire, donc au bout d'un certains nombre de fichiers (ça doit dépendre de leur taille), ça pète.
 
Solutions :
- utiliser une lib zip plus performante ?
- revoir ton algo pour écrire le fichier zip sur le disque au fur et à mesure pour libérer la mémoire. Par contre ça sera surement plus lent (de toutes façons il faut toujours faire un choix entre vitesse et occupation mémoire)


---------------
When it's from Finland it's good.  - Mon blog
Reply

Marsh Posté le 19-06-2007 à 17:33:54    

soju a écrit :

t'as bien viré la ligne [i]$archive = $zip->file();


 
Ca demande à être vérifié, mais il me semble que php est suffisamment intelligent pour ne pas recopier le contenu de la variable si elle n'est pas modifiée plus loin dans le code (ce qui est le cas ici), il doit faire simplement une référence. Du moins j'espère...  :sweat:  


---------------
When it's from Finland it's good.  - Mon blog
Reply

Marsh Posté le 19-06-2007 à 17:33:54   

Reply

Marsh Posté le 20-06-2007 à 09:43:53    

merci pour vos réponses
 
j'ai bien viré $archive = $zip->file();
je me retrouve avec ça :

Code :
  1. require_once('inc/zip.lib.php');
  2. $tab_mp3 = array( 'test1.mp3','test2.mp3','test3.mp3','test4.mp3' );
  3. $zip = new zipfile();
  4. $i = 1;
  5. foreach( $tab_mp3 as $value ){
  6. $fp = fopen( 'mp3/' . $value,'r' );
  7. $content = fread( $fp,filesize( 'mp3/' . $value ) );
  8. fclose( $fp );
  9. $zip->addfile( $content,$i . '_' . date( 'Ymd' ) . '.mp3' );
  10. $i++;
  11. }
  12. header( 'Content-Type: application/x-zip' );
  13. header( 'Content-Disposition: inline; filename=mp3.zip' );
  14. echo $zip->file();


 
cgo2 >
"utiliser une lib zip plus performante ?" tu en as une à me conseiller?
"revoir ton algo pour écrire le fichier zip sur le disque au fur et à mesure pour libérer la mémoire" tu pense à quelque chose en particulier?

Reply

Marsh Posté le 20-06-2007 à 10:00:59    

zbang a écrit :

"utiliser une lib zip plus performante ?" tu en as une à me conseiller?


 
Aucune idée, j'ai jamais eu besoin de faire du zip, mais si l'occasion se présentait je pense que je me pencherais du côté de l'extension standard de PHP :  
http://fr.php.net/manual/fr/ref.zip.php
 

zbang a écrit :

"revoir ton algo pour écrire le fichier zip sur le disque au fur et à mesure pour libérer la mémoire" tu pense à quelque chose en particulier?


 
Non, je ne connais pas ta librairie ni les méthodes qu'elle propose. C'est juste une indication en général : quand un algo prend trop de mémoire, tu t'arranges pour utiliser le disque au fur et à mesure (c'est le principe du swap quoi). Après c'est à toi de voir si cette solution est possible dans ton contexte.


---------------
When it's from Finland it's good.  - Mon blog
Reply

Marsh Posté le 20-06-2007 à 19:33:32    

merci pour ta réponse, je vais voir du coté de la lib zip standard.

Reply

Sujets relatifs:

Leave a Replay

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