IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[Images] Galerie photo (Fatal error: Allowed memory size)


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 21
    Points : 16
    Points
    16
    Par défaut [Images] Galerie photo (Fatal error: Allowed memory size)
    Bonjour les gens!
    Voilà, j'explique mon petit problème: je dois créer un site composé de plusieurs galeries. Chacune d'entre-elles est accessible via un menu. les images de chaque galerie sont stockées dans des dossiers portant le nom de cette dernière (le nom de la galerie quoi ). Pour afficher les images je n'ai qu'a lister le dossier voulu et écrire les liens en fonction du résultat.

    Jusque là, pas de problème. La ou ça coince, c'est au niveau de mon administration. Il faut prévoir la possibilité d'ajouter une galerie. J'arrive à créer le dossier (voici l'arborescence : magalerie -> thumb - photos). Ensuite, j'ai créé un petit formulaire d'upload. Voici le script qui traite l'envoi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    <?php
     
      if(isset($_POST['send_btn'])) {
     
        $root = $_POST['gallery'];
        $repertoire = $root ."photos/";
        $extensions_ok = array('jpg','JPG','jpeg','JPEG');
        $nomorg = $_FILES['nomfich']['name'];
     
        if( !in_array( substr(strrchr($_FILES['nomfich']['name'], '.'), 1), $extensions_ok ) ) {
    	if($_FILES['nomfich']['name'] != "") { 
    		echo "<p>Format non attendu</p>"; 
    	}
        $echec = 1;
        } 
        if($echec != 1) {
    	$temp = $_FILES['nomfich']['tmp_name'];
    	$nomorg = strtr($nomorg,
          'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ',
          'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
     
    	$nomorg = preg_replace('/([^.a-z0-9]+)/i', '_', $nomorg);
    	$nomdef = $repertoire .$nomorg;
     
    	if (!file_exists($nomdef)) {
    	  move_uploaded_file($temp, $nomdef);	
    	  photoZoom($nomdef);
    	  echo "<p>Photo envoyée</p>";
    	}
    	else if (file_exists($nomdef)){ 	
    	  echo "<p>La photo existe déjà</p>";
    	}
        }
    }
    ?>
    Dans ce script, il y a un appel de fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    photoZoom($nomdef);
    Voici la fonction en question:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    function photoZoom($dir) {
     
      $im = imagecreatefromjpeg($dir);
      // Récupération des dimensions
      $ox = imagesx($im);
      $oy = imagesy($im);
     
      if ($ox != 500 || $oy != 500) {
        // Si paysage
        if ($oy<$ox) {
    	$nx = 500;
    	$ny = floor($oy * (500 / $ox));
        }
        else {
    	$ny = 500;
    	$nx = floor($ox * (500/ $oy));
        }
     
        // Création de l'image redimensionnée
        $nm = imagecreatetruecolor($nx, $ny);
        imagecopyresampled($nm, $im, 0, 0, 0, 0, $nx, $ny, $ox, $oy);
        imagejpeg($nm, $dir);
        imagedestroy ($im);
      }
     
    }
    Les images doivent être redimensionnées car la résolution de l'image source n'est pas adaptée au web. Tout cela fonctionne lors d'un premier envoi. Si j'efface manuellement la photo pour ensuite la renvoyer, ça fonctionne. Par contre si j'en envois une seconde image, j'ai ce message d'erreur:

    Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 9920 bytes) in C:\Program Files\wamp\www\test\admin\include\pic_functions.php on line 5
    Même si ça ne me semble pas être une excellente idée, j'ai fait un test en modifiant php.ini (memory_limit = 8M -> 16M), le problème reste le même. Je suis conscient que le code de la fonction n'est pas optimisé et en aurait bien besoin mais je ne vois pas comment procéder. C'est pourquoi je vous demande votre aide. J'espère vous lire bientôt et avoir été assez clair dans mes explications.

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de N1bus
    Homme Profil pro
    Dev. Web & OpenERP
    Inscrit en
    Janvier 2003
    Messages
    2 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Dev. Web & OpenERP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 827
    Points : 5 673
    Points
    5 673
    Par défaut
    Bonjour,

    c'est quoi la ligne 5 de pic_functions.php ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Bonjour bonjour!
    Oui désolé j'aurais du le préciser, la ligne 5:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $im = imagecreatefromjpeg($dir);
    L'exécution du script est plutôt longue, j'ai également essayé "imagecopyresized" au lieu de "imagecopyresampled", le script s'exécute plus rapidement mais même problème lors d'un nouvel envoi et l'image perd en qualité.

    Voila et merci de vous intéresser si vite à mon cas .

  4. #4
    Expert confirmé
    Avatar de N1bus
    Homme Profil pro
    Dev. Web & OpenERP
    Inscrit en
    Janvier 2003
    Messages
    2 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Dev. Web & OpenERP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 827
    Points : 5 673
    Points
    5 673
    Par défaut
    Quelle est la taille des fichiers que tu envoies ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Là je teste en local avec des fichiers dont la taille varie de presque rien à 1.5Mo. Tout ceci n'est pas pour moi et les photos qui seront envoyées seront tout aussi lourdes (voir plus). Une collection comprend +/- 25 photos de ce type donc là c'est la galère

  6. #6
    Expert confirmé
    Avatar de N1bus
    Homme Profil pro
    Dev. Web & OpenERP
    Inscrit en
    Janvier 2003
    Messages
    2 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Dev. Web & OpenERP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 827
    Points : 5 673
    Points
    5 673
    Par défaut
    Là, je ne comprends pas.
    Généralement l'erreur Max Memory survient dans le cas où ton script dépasse la taille mémoire allouée. ça arrive souvent lors de boucles assez longues.

    Toutes ces fonctions sont dans une boucle ?
    Tu traites un répertoire entier ou une image à la fois ?

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Non il n'y a pas de boucle, juste un else en fin de code pour afficher le formulaire quand on arrive sur la page. La fonction est appelée une fois que l'image a été placée dans le bon dossier. Celle-là et uniquement celle-là est redimensionnée. Au début j'avais une boucle qui vérifiait le contenu de tout le dossier et traitait les images, c'était inutile et je pensais que le problème venait de là mais visiblement non. Le pire c'est que quel que soit la mémoire allouée, le script plante de la même façon.

    Edit: J'ai essayé les multiples de 8 et ça passe avec 128M
    Bon je ne dois pas être le seul à trouver ça énorme pour un script! Un autre truc bizarre, pour une photo sur 2, le traitement est plus long.

  8. #8
    Expert confirmé
    Avatar de N1bus
    Homme Profil pro
    Dev. Web & OpenERP
    Inscrit en
    Janvier 2003
    Messages
    2 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Dev. Web & OpenERP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 827
    Points : 5 673
    Points
    5 673
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    imagejpeg($nm, $dir); // ici tu crées l'image $nm
    imagedestroy ($im); // ici tu détruis l'image $im
    A mon avis l'erreur vient de là. ton image n'est pas détruite et la mémoire utilisée n'est pas libérée.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    En effet ça vient de là (oups la boulette ) Merci bien!
    En fait je pensais qu'il fallait supprimer le résultat de imagecreatefromjpeg, les exemples que j'ai consulté utilisant la même variable pour les différentes opérations.

    Encore merci pour ton aide donc
    On peut considérer ce post comme résolu. A bientôt!

  10. #10
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 68
    Points : 65
    Points
    65
    Par défaut
    Bonjour, pardonnez mon ignorance, mais je ne vois pas comment vous avez résolu le problème.

    Ce que tu indiques N1bus, est la même chose de ce qu'il a écrit dans son code.

    j'ai la même erreur, (que je n'avais pas avant que j'installe une nouvelle version d'apache). Le script fonctionne chez un serveur de Free, mais pas en local chezm moi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    function createThumb($filename,$repDest){
      echo "Création de miniature<br/>";
      $type = exif_imagetype($filename);
      if ($type == 2 ){ //2 => IMAGETYPE_JPEG
      	list ($width, $height) = getimagesize($filename);
      	// chargement de l'image
      	//truecolor sinon probleme de couleur dans le redimensionnement.
      	$thumb =  imagecreatetruecolor($this->MINI_WIDTH,$this->MINI_HEIGHT);
    	$source = imagecreatefromjpeg($filename);
    	// Redimensionnement si > 538 px
    	imagecopyresampled($thumb, $source, 0, 0, 0, 0, $this->MINI_WIDTH, $this->MINI_HEIGHT , $width, $height);
    	// création de la miniature
    	imagejpeg($thumb,$repDest,100);//copie
    	echo "Fin de création de la miniature<br/>";
    	imagedestroy($source);
     
        }
    }
    l'erreur pointe sur la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $source = imagecreatefromjpeg($filename);
    Merci de bien vouloir m'expliquer ce que je n'ai pas compris

  11. #11
    Expert confirmé
    Avatar de N1bus
    Homme Profil pro
    Dev. Web & OpenERP
    Inscrit en
    Janvier 2003
    Messages
    2 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Dev. Web & OpenERP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 827
    Points : 5 673
    Points
    5 673
    Par défaut
    Bonjour,

    Tu ne détruis pas l'image que tu crées ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $thumb =  imagecreatetruecolor .......


    Il faut que tu rajoutes à la fin de la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    imagedestroy($thumb);
    Si ton script fonctionne chez FREE et pas chez toi, ça vient peut-etre de ça :
    imagecreatetruecolor() : Cette fonction requiert la bibliothèque GD 2.0.1 ou supérieure (2.0.28 ou supérieure est recommendée).

  12. #12
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 68
    Points : 65
    Points
    65
    Par défaut
    J'ai pourtant la librairie gd 2, je me suis rendu compte d'une chose assez étonnante, c'est que ca ne marche pas sur certaine photos ... (prise avec un réflex). Mais pourtant cela fonctionne chez Free.

    en rajoutant imagedestroy($thumb) ca me renvoi toujours cette erreur

    Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 15552 bytes) in
    en pointant sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $source = imagecreatefromjpeg($filename);

  13. #13
    Expert confirmé
    Avatar de N1bus
    Homme Profil pro
    Dev. Web & OpenERP
    Inscrit en
    Janvier 2003
    Messages
    2 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Dev. Web & OpenERP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 827
    Points : 5 673
    Points
    5 673
    Par défaut
    Regarde le phpinfo() chez FREE et compares avec le tien.

    notament memory_limit

  14. #14
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 68
    Points : 65
    Points
    65
    Par défaut
    c'est ce que j'ai fait, je trouve cette différence qui se trouve dans les directives de la librairie gd :

    Local (WampServer) :
    gd
    GD Support enabled
    GD Version bundled (2.0.34 compatible)
    FreeType Support enabled
    FreeType Linkage with freetype
    FreeType Version 2.1.9
    T1Lib Support enabled
    GIF Read Support enabled
    GIF Create Support enabled
    JPG Support enabled
    PNG Support enabled
    WBMP Support enabled
    XBM Support enabled
    Chez Free :
    gd
    GD Support enabled
    GD Version 2.0 or higher
    FreeType Support enabled
    FreeType Linkage with freetype
    FreeType Version 2.2.1
    T1Lib Support enabled
    GIF Read Support enabled
    GIF Create Support enabled
    JPG Support enabled
    PNG Support enabled
    WBMP Support enabled
    ca peut provenir de là ?

  15. #15
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Bon le post date mais je suis tombé dessus avec google en tapant l'erreur que j'avais en local et pas chez Free : Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 9920 bytes) in

    J'ai suivi la piste de N1bus sur la valeur de memory_limit qui est de 32M chez free et qui était par défaut de 8M sur mon wamp soit les 8388608 bytes assurément.

    Pour ça il suffit par exemple de changer la ligne de ..\Apache2\bin\php.ini :
    memory_limit = 8M ; Maximum amount of memory a script may consume (8MB)
    en
    memory_limit = 32M

    Edit : en fait je suis retombé sur le problème même avec des images de 400ko et après une heure d'investigation je viens de comprendre que c'est pas uniquement la taille en octet qui compte mais surtout la taille en pixels (cf. : http://www.igalerie.org/faq.php) car la librairie GD convertit au format bmp les images chargées en mémoire

  16. #16
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Un article très clair: http://www.igalerie.org/faq.php

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Spip] Image sous Spip : Fatal error: Allowed memory size
    Par clio671 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 12/10/2010, 13h23
  2. [PEAR][Mail] Fatal Error : Allowed memory size of 8388608 bytes exhausted
    Par bigben89 dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 20/10/2008, 18h01
  3. Réponses: 3
    Dernier message: 08/08/2007, 19h08
  4. [Librairies] zip.lib.php Fatal error: Allowed memory size of 8388608 bytes exhausted
    Par manaboko dans le forum Bibliothèques et frameworks
    Réponses: 9
    Dernier message: 22/05/2006, 10h42
  5. Fatal error: Allowed memory size of...
    Par Webfab dans le forum Langage
    Réponses: 3
    Dernier message: 17/09/2005, 10h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo