Fatal error: Allowed memory size

Résolu
Signaler
Messages postés
50
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
10 février 2009
-
Messages postés
50
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
10 février 2009
-
Bonjour à tous,

J'ai un code qui crée des miniatures après upload des photos. Quand j'envoi des photos de 400ko environ il n'y a aucun soucis mais lorsque les photos ont un poids de 1MO et plus il y a problème "Fatal error: Allowed memory size......"

Voici le code qui crée les miniatures:

<?php


function createthumb($name,$filename,$new_w,$new_h){
 $system=explode('.',$name);
 if (preg_match('/jpg|jpeg|JPG|JPEG/',$system[1])){
  $src_img=imagecreatefromjpeg($name);
 }
 if (preg_match('/png/',$system[1])){
  $src_img=imagecreatefrompng($name);
 }


$old_x=imageSX($src_img);
$old_y=imageSY($src_img);
if ($old_x > $old_y) {
 $thumb_w=$new_w;
 $thumb_h=$old_y*($new_h/$old_x);
}
if ($old_x < $old_y) {
 $thumb_w=$old_x*($new_w/$old_y);
 $thumb_h=$new_h;
}
if ($old_x == $old_y) {
 $thumb_w=$new_w;
 $thumb_h=$new_h;
}


$dst_img=ImageCreateTrueColor($thumb_w,$thumb_h);
 imagecopyresampled($dst_img,$src_img,0,0,0,0,$thumb_w,$thumb_h,$old_x,$old_y);


if (preg_match("/png/",$system[1]))
{
 imagepng($dst_img,$filename);
} else {
 imagejpeg($dst_img,$filename);
}
imagedestroy($dst_img);
imagedestroy($src_img);
}


?>

et ce qu'il y a dans ma page pour 6 photos donc ce code 6 fois de suite:

<?php

if (empty($dest_fichier1))
    {
    $photo1 = "default.jpg";  
    }
    else
    {
    $photo1 = $dest_fichier1;
   createthumb($dest_dossier . $dest_fichier1, $dossier_thumbs . $dest_fichier1, $taille_thumbs1, $qualite_thumbs1);
    createthumb($dest_dossier . $dest_fichier1, $dossier_final . $dest_fichier1, $taille_thumbs2, $qualite_thumbs2);
   unlink($dest_dossier . $dest_fichier1);
   }
?>

Quelles sont les solutions ?

D'avance merci.

11 réponses

Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
26
Et puis à la limite si tu parviens à travailler sur une image comme ça, tu n'y arriveras pas sur plusieurs en boucle.
Normal...PHP ne libèrera pas les ressources correctement ni complètement.
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
26
Hello,

travailler sur de plus petites images...
Non, GD est gourmand de toute manière. On est sur une techno web là, il ne faut pas l'oublier, c'est pas Photoshop ton truc. Faut pas trop lui en demander.
Seule solution à part ça : modifier la conf de php si tu le peux. Il s'agit de cette directive :
memory_limit
tu peux la modifier dans le php.ini, ou via un ini_set().
SI ton hébergement te le permet...
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Membre
Dernière intervention
30 juillet 2012
42
mon appareil fait des photos de : 3072 * 2304

multiplie par 3 pour avoir des couleurs 24 bits

une fois decompresse, mon jpeg prend :

3072 * 2304 * 3 octets de memoire

>>> 3072 * 2304 * 3
21233664
>>> 21233664 / 1024
20736
>>> 21233664 / 1024 / 1024
20
>>>

ca fait en gros 20 MO de memoire

/**
* @author coucou747 <coucou747@hotmail.com>
* @see irc://cominweb.uni-irc.net/#programmation
*/
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
26
et ?
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
26
Mon "et?" n'est pas "méchant" hein, c'est juste que je n'ai pas compris où tu voulais en venir en disant ça ?
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Membre
Dernière intervention
30 juillet 2012
42
c'est juste pour donner un ordre d'idee de ce qui consome GD

perso j'ai :

max@debian:~$ cat /etc/php5/apache2/php.ini | grep memory_limit
memory_limit = 128M      ; Maximum amount of memory a script may consume (128MB)
max@debian:~$

/**
* @author coucou747 <coucou747@hotmail.com>
* @see irc://cominweb.uni-irc.net/#programmation
*/
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
26
Ben essaye de travailler ton image avec GD et ce php.ini. Tu n'y arriveras pas.
Prend n'importe quel logiciel de retouche photo, fous lui une image de 20Mo, bosse dessus et regarde tes ressources CPU et la mémoire utilisée surtout. C'est exponentiel. Une image de 20Mo ne prend pas 20Mo de mémoire pour travailler dessus. Ce sera beaucoup plus gourmand.
Messages postés
50
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
10 février 2009

Si je comprends bien je peux mettre


ini_set("memory_limit", "128M")

Celà fonctionne t-il en safe mode ?
Messages postés
50
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
10 février 2009

D'accord donc la seule solution c'est de les réduire avant.

D'accord merci.
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
26
128M c'est par défaut, normalement. Je ne sais pas pour safe_mode. A priori...non. Mais bon.
Messages postés
50
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
10 février 2009

Si je regarde le phpinfo() la limite est à 40M. Comme c'est un hebergement mutualisé je n'ai pas accès a php.ini.

Je vais faire un test avec ini_set().

Merci.