Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > Images
Images Forum d'entraide sur les bibliothèques graphiques avec PHP. Exemples : GD, ImageMagick, JpGraph, Artichow... Avant de poster -> FAQ GD, Cours GD et Sources GD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/04/2007, 01h03   #1
Invité régulier
 
Inscription : mai 2006
Messages : 21
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 21
Points : 8
Points : 8
Par défaut 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 :
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 :
1
2
 
photoZoom($nomdef);
Voici la fonction en question:

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

Citation:
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
Dookie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2007, 01h16   #2
Rédacteur/Modérateur
 
Avatar de N1bus
 
Inscription : janvier 2003
Messages : 2 018
Détails du profil
Informations personnelles :
Âge : 47
Localisation : France, Charente Maritime (Poitou Charente)

Informations forums :
Inscription : janvier 2003
Messages : 2 018
Points : 1 992
Points : 1 992
Bonjour,

c'est quoi la ligne 5 de pic_functions.php ?
N1bus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2007, 01h21   #3
Invité régulier
 
Inscription : mai 2006
Messages : 21
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 21
Points : 8
Points : 8
Bonjour bonjour!
Oui désolé j'aurais du le préciser, la ligne 5:

Code :
$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 .
Dookie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2007, 10h26   #4
Rédacteur/Modérateur
 
Avatar de N1bus
 
Inscription : janvier 2003
Messages : 2 018
Détails du profil
Informations personnelles :
Âge : 47
Localisation : France, Charente Maritime (Poitou Charente)

Informations forums :
Inscription : janvier 2003
Messages : 2 018
Points : 1 992
Points : 1 992
Quelle est la taille des fichiers que tu envoies ?
N1bus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2007, 12h09   #5
Invité régulier
 
Inscription : mai 2006
Messages : 21
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 21
Points : 8
Points : 8
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
Dookie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2007, 12h19   #6
Rédacteur/Modérateur
 
Avatar de N1bus
 
Inscription : janvier 2003
Messages : 2 018
Détails du profil
Informations personnelles :
Âge : 47
Localisation : France, Charente Maritime (Poitou Charente)

Informations forums :
Inscription : janvier 2003
Messages : 2 018
Points : 1 992
Points : 1 992
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 ?
N1bus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2007, 12h29   #7
Invité régulier
 
Inscription : mai 2006
Messages : 21
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 21
Points : 8
Points : 8
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.
Dookie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/04/2007, 09h07   #8
Rédacteur/Modérateur
 
Avatar de N1bus
 
Inscription : janvier 2003
Messages : 2 018
Détails du profil
Informations personnelles :
Âge : 47
Localisation : France, Charente Maritime (Poitou Charente)

Informations forums :
Inscription : janvier 2003
Messages : 2 018
Points : 1 992
Points : 1 992
Code :
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.
N1bus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/04/2007, 17h28   #9
Invité régulier
 
Inscription : mai 2006
Messages : 21
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 21
Points : 8
Points : 8
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!
Dookie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2007, 21h02   #10
Membre du Club
 
Inscription : juin 2007
Messages : 68
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 68
Points : 42
Points : 42
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 :
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 :
$source = imagecreatefromjpeg($filename);
Merci de bien vouloir m'expliquer ce que je n'ai pas compris
Marcolinho est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2007, 01h42   #11
Rédacteur/Modérateur
 
Avatar de N1bus
 
Inscription : janvier 2003
Messages : 2 018
Détails du profil
Informations personnelles :
Âge : 47
Localisation : France, Charente Maritime (Poitou Charente)

Informations forums :
Inscription : janvier 2003
Messages : 2 018
Points : 1 992
Points : 1 992
Bonjour,

Tu ne détruis pas l'image que tu crées ici :
Code :
$thumb =  imagecreatetruecolor .......


Il faut que tu rajoutes à la fin de la fonction
Code :
1
2
 
imagedestroy($thumb);
Si ton script fonctionne chez FREE et pas chez toi, ça vient peut-etre de ça :
Citation:
imagecreatetruecolor() : Cette fonction requiert la bibliothèque GD 2.0.1 ou supérieure (2.0.28 ou supérieure est recommendée).
N1bus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2007, 20h20   #12
Membre du Club
 
Inscription : juin 2007
Messages : 68
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 68
Points : 42
Points : 42
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

Citation:
Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 15552 bytes) in
en pointant sur la ligne
Code :
$source = imagecreatefromjpeg($filename);
Marcolinho est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2007, 01h19   #13
Rédacteur/Modérateur
 
Avatar de N1bus
 
Inscription : janvier 2003
Messages : 2 018
Détails du profil
Informations personnelles :
Âge : 47
Localisation : France, Charente Maritime (Poitou Charente)

Informations forums :
Inscription : janvier 2003
Messages : 2 018
Points : 1 992
Points : 1 992
Regarde le phpinfo() chez FREE et compares avec le tien.

notament memory_limit
N1bus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2007, 19h35   #14
Membre du Club
 
Inscription : juin 2007
Messages : 68
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 68
Points : 42
Points : 42
c'est ce que j'ai fait, je trouve cette différence qui se trouve dans les directives de la librairie gd :

Local (WampServer) :
Citation:
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 :
Citation:
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à ?
Marcolinho est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2008, 11h33   #15
Invité de passage
 
Inscription : septembre 2007
Messages : 2
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 2
Points : 1
Points : 1
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
Aknot63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2010, 12h13   #16
Membre confirmé
 
Avatar de dacid
 
Homme
Inscription : juin 2003
Messages : 859
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : juin 2003
Messages : 859
Points : 260
Points : 260
Un article très clair: http://www.igalerie.org/faq.php
__________________
David.
dacid est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h53.


 
 
 
 
Partenaires

Hébergement Web