Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1305 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  problème de memory_limit

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

problème de memory_limit

n°1565006
zbang
Posté le 25-05-2007 à 10:10:44  profilanswer
 

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 :)

 

mood
Publicité
Posté le 25-05-2007 à 10:10:44  profilanswer
 

n°1565030
soju
One shot !
Posté le 25-05-2007 à 10:48:11  profilanswer
 

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();

n°1565040
zbang
Posté le 25-05-2007 à 11:01:27  profilanswer
 

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?

 


n°1576617
zbang
Posté le 19-06-2007 à 09:18:39  profilanswer
 

:bounce:

n°1576631
soju
One shot !
Posté le 19-06-2007 à 09:53:13  profilanswer
 

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

n°1576929
zbang
Posté le 19-06-2007 à 17:14:43  profilanswer
 

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
n°1576943
cgo2
Dum spiro spero
Posté le 19-06-2007 à 17:22:45  profilanswer
 

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
n°1576946
soju
One shot !
Posté le 19-06-2007 à 17:26:39  profilanswer
 

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
n°1576950
cgo2
Dum spiro spero
Posté le 19-06-2007 à 17:29:01  profilanswer
 

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
n°1576953
cgo2
Dum spiro spero
Posté le 19-06-2007 à 17:33:54  profilanswer
 

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
mood
Publicité
Posté le 19-06-2007 à 17:33:54  profilanswer
 

n°1577084
zbang
Posté le 20-06-2007 à 09:43:53  profilanswer
 

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?

n°1577093
cgo2
Dum spiro spero
Posté le 20-06-2007 à 10:00:59  profilanswer
 

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
n°1577408
zbang
Posté le 20-06-2007 à 19:33:32  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  problème de memory_limit

 

Sujets relatifs
[Résolu] Problème d'include[ Résolu ] Problème lors du Passage des Paramètes
Probleme d'arrondiProblème entre argument + fonction + variable + espace
Problème de création de bouclesProblème requete SQL sur du PHP
[JS] Problème de rafraichissement de l'affichageDirectShow - Problème de FullScreen
[HELP] Problème de TableauProblème d'installation du forum phpBB
Plus de sujets relatifs à : problème de memory_limit


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR