Probleme de dimensions dans un script de traitement d'image

Probleme de dimensions dans un script de traitement d'image - PHP - Programmation

Marsh Posté le 28-07-2005 à 12:17:44    

Hello à tous,
 
 
J'ai sur mon site un script de redimensionnement d'image, qui va donc réduire une image qu'on vient d'uploader... Ce script a toujours très bien fonctionné, mais depuis que j'ai ce nouvel hébergement chez Nexlink, les images ne passaient plus... Avec ce message d'erreur :
 

Citation :

Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate
2000 bytes) in /mnt/sites/shootmeagain.com/web/thumb.php on line 6


 
La ligne 6 étant la suivante :  
$img = ImageCreateFromJpeg($file);
 
J'ai eu le problème avec une image de 2000x1000 pixels alors qu'une image de
2000x500 pixels marche sans problème...
 
 
Et j'ai reçu cette réponse du service technique Nexlink :
 

Citation :

Bonjour,
 
La mémoire allouée pour l'exécution des scripts PHP est de 8Mo. Avec ce genre de
traitement, la résolution maximale supportée est d'environ 1024x768. Il faut
savoir que pour le traitement d'image, le serveur doit décompresser celle-ci
afin de pouvoir la redimensionner.
 
Meilleures salutations,
NexLink Support Team


 
 
Que faire pour contourner ce problème ? J'espère qu'il y a un moyen quelconque? :/


Message édité par Dawa le 28-07-2005 à 12:18:04

---------------
SHOOT ME AGAIN WEBZINE
Reply

Marsh Posté le 28-07-2005 à 12:17:44   

Reply

Marsh Posté le 28-07-2005 à 12:20:27    

ca ne te semble pas un peu grand 2000*1000 ?


---------------
http://www.alsacreations.com , http://www.openweb.eu.org. Mon CV : http://cv.roane-irkana.net/. Exemple à ne surtout pas suivre : www.worldinternet.be
Reply

Marsh Posté le 28-07-2005 à 12:46:45    

C'etait pour tester... C'est pour faire des galeries de photos, et les gens qui participent au site balancent parfois leur photo non retouché, en 1600*1200 par exemple, et c'est le script qui est censé se charger du reste.


---------------
SHOOT ME AGAIN WEBZINE
Reply

Marsh Posté le 28-07-2005 à 14:33:37    

C'est bizarre ton truc, je fais régulièrement des transferts d'image de 2272x1704 (natif mon APN quoi) et j'ai aucun soucis.
Bon, j'suis sur un dédié, mais ma mémoire est quand même fixé à 8Mo par script Max. et ça fonctionne quand même très bien.

Reply

Marsh Posté le 28-07-2005 à 14:36:04    

Par contre, tu détruis bien tes images après traitement ?
 
Fais voir ton script de redimentionnement...

Reply

Marsh Posté le 28-07-2005 à 14:54:43    

voici le script complet...
 
 

Code :
  1. function resize($file, $tofname, $maxWidth, $maxHeight, $path)
  2.   {
  3.     $prod=$maxWidth*$maxHeight;
  4.      //Créé une image à partir de $file
  5.       $img = ImageCreateFromJpeg($file);
  6.      //Dimensions de l'image
  7.      $imgWidth = imagesx($img);
  8.      $imgHeight = imagesy($img);
  9.      //Facteur largeur/hauteur des dimensions max
  10.      $whFact = $maxWidth/$maxHeight;
  11.      //Facteur largeur/hauteur de l'original
  12.      $imgWhFact = $imgWidth/$imgHeight;
  13.      //fixe les dimensions du thumb
  14.      if($imgWidth <= $maxWidth && $imgHeight <= $maxHeight)
  15.      {
  16.          $thumbWidth=$imgWidth;
  17.          $thumbHeight=$imgHeight;
  18. }
  19. else
  20. {     
  21.          if($imgWidth > $imgHeight)
  22.          {
  23.             //Si largeur déterminante
  24.             $thumbWidth  = $maxWidth;
  25.             $thumbHeight = $thumbWidth/$imgWhFact;
  26.             if($thumbHeight>$maxHeight)
  27.             {
  28.                 $redimfact=$thumbHeight/$maxHeight;
  29.                 $thumbHeight=$maxHeight;
  30.                 $thumbWidth=$thumbWidth/$redimfact;
  31.             }
  32.            }
  33.            else
  34.            {
  35.             //Si hauteur déterminante
  36.             $thumbHeight = $maxHeight;
  37.             $thumbWidth = $thumbHeight*$imgWhFact;
  38.             if($thumbWidth>$maxWidth)
  39.             {
  40.                 $redimfact=$thumbWidth/$maxWidth;
  41.                 $thumbWidth=$maxWidth;
  42.                 $thumbHeight=$thumbHeight/$redimfact;
  43.             }
  44.         }
  45.     }
  46.      //Créé le thumb (image réduite)
  47.      $imgThumb = ImageCreateTruecolor($thumbWidth, $thumbHeight);
  48.      //Insère l'image de base redimensionnée
  49.      ImageCopyResampled($imgThumb, $img, 0, 0, 0, 0, $thumbWidth,
  50. $thumbHeight, $imgWidth, $imgHeight);
  51.      //Nom du fichier thumb
  52.      //list($titretof,$ext,$temp) = explode(".",$file);
  53.      $imgThumbName = $path.$tofname;
  54.      //Créé le fichier thumb
  55.   $fp = fopen($imgThumbName, "wb" );
  56.    fclose($fp);
  57.     // fflush($fp);
  58.      //Renvoie le thumb créé
  59.      ImageJpeg($imgThumb, $imgThumbName,90);
  60.      return $imgThumbName;
  61.   }


 
 
hmmmm je remarque qu'en effet je détruis ptetre pas vraiment tout en fait :o  
 
un truc qui peut coincer là dedans ?


---------------
SHOOT ME AGAIN WEBZINE
Reply

Marsh Posté le 28-07-2005 à 15:03:42    

à part le fait que  
#   $fp = fopen($imgThumbName, "wb" );
#    fclose($fp);
ne sert à rien, non.
Par contre, pense à détruire tes images dès que tu n'en as plus besoin (imagedestroy($imgThumb); imagedestroy($img);), autrement, le script conserve peut-être tout en mémoire et zou, ça marche à la première et pas à la seconde.

Reply

Marsh Posté le 28-07-2005 à 16:22:25    

voilà j'ai ajouté  
 
imagedestroy($imgThumb);  
imagedestroy($img);
 
 
juste avant le return et j'ai enlevé les 2 lignes inutiles...
 
mais ca marche toujours pas :/  
ca peut venir d'ou ? :/  
 
merci


---------------
SHOOT ME AGAIN WEBZINE
Reply

Marsh Posté le 28-07-2005 à 16:29:28    

Fait un PHP info sur ton serveur, donne ta version de PHP, moi j'ai cette ligne là :
memory_limit 8M 8M
 
Donc, bien que je sois sur un dédié, je suis également limité à 8M et j'y arrive sans problème (dès fois j'en transfert même plusieurs en même temps avec plusieurs onglets).
Par contre, je ne sais pas si la mémoire maximum concerne chaque utilisateur ou tous les utilisateurs qui partagent le serveur (si tu es sur un mutualisé par ex.)

Reply

Marsh Posté le 28-07-2005 à 23:51:03    

Warning: phpinfo() has been disabled for security reasons in /mnt/sites/shootmeagain.com/web/phpinfo.php on line 2
 
super :D
 
mais qd le type me dit
 

Citation :


La mémoire allouée pour l'exécution des scripts PHP est de 8Mo. Avec ce genre de
traitement, la résolution maximale supportée est d'environ 1024x768. Il faut
savoir que pour le traitement d'image, le serveur doit décompresser celle-ci
afin de pouvoir la redimensionner.


 
c'est n'importe quoi alors? Si c'est du 8 megas ca devrait passer... sur mon ancien hébergeur en tout cas j'ai dans le phpinfo
 
post_max_size 8M 8M  
 
et ca marchait... :sweat:


---------------
SHOOT ME AGAIN WEBZINE
Reply

Marsh Posté le 28-07-2005 à 23:51:03   

Reply

Marsh Posté le 28-07-2005 à 23:59:12    

:??:


---------------
ACH/VDSHFRCoin◈1435mm⚡
Reply

Marsh Posté le 28-07-2005 à 23:59:38    

Bah ça me parait bizarre.
Enfin, je sais pas, moi j'ai toujours fonctionné comme ça même avant mon dédié, je transférais direct de mon APN, c'était pas super rapide (900ko en moyenne), mais ça fonctionnait même chez mon mutualisé.

Reply

Marsh Posté le 29-07-2005 à 00:00:41    

:D Change d'hébergeur  :D


Message édité par Natopsi le 29-07-2005 à 00:00:55

---------------
ACH/VDSHFRCoin◈1435mm⚡
Reply

Marsh Posté le 29-07-2005 à 00:06:50    

Ca me parait bizarre aussi... Je suis chez cet hébergeur depuis une semaine :D
 
Je recontacterai le service technique on verra bien... mais c'est clair qu'il y a rien de logique là :/


---------------
SHOOT ME AGAIN WEBZINE
Reply

Marsh Posté le 29-07-2005 à 00:11:14    

Au pire, une image de 2000 x 1000 pixels, ça prend, une fois décompréssé 6000000 d'octets, normalement, avec 8388608, ça te laisse plus de 2000000 pour créer ta miniature, ça devrait suffire, à moins que ton script qui précède soit vraiment vraiment énorme ou que ton image contienne des couches alphas.


Message édité par The-Shadow le 29-07-2005 à 00:11:25
Reply

Marsh Posté le 29-07-2005 à 08:25:15    

bah j'ai testé avec un jpg rempli de blanc qui fait meme pas 10ko...
 
et le script qui precede c'est juste une formulaire d'upload, rien de très gourmand...
 

Citation :

$nomtof="image".$i;
 if(is_uploaded_file ($_FILES[$nomtof]['tmp_name']))
 {  
  $tof=$_FILES[$nomtof]['tmp_name'];
  $newname=$_FILES[$nomtof]['name'];
  $newname = rawurldecode($newname);  
  $newname=no_accent($newname);
  $newname=strtolower($newname);
  $resized=resize($tof,$newname,800,700,"photos/".$_POST['gal']."/" );
  $thumb=resize($tof,$newname,130,130, "photos/".$_POST['gal']."/small/" );
  MAJtof($_POST['mode'], $_POST, $bd, $newname);
  $ok=1;
 }
 else
 {
  if($ok!=1)
  {
   echo div("redirect" );
   echo "Erreur envoi fichier";
   echo findiv();
  }
  $ok=-1;
 }


---------------
SHOOT ME AGAIN WEBZINE
Reply

Marsh Posté le 07-08-2005 à 13:46:32    

Juste pour info, j'ai pu contourner cette limite de 8megas (qui n'est apparemment effective que sur certaines versions de PHP, c'est pourquoi ça peut marcher chez vous avec de plus grosses images, le script prend malgré tout + de 8 megas...).
 
il a suffi d'ajouter  
 

Code :
  1. ini_set("memory_limit","20M" );


 
au début de mon script, puisque je n'avais bien sur pas accès au php.ini...
 
merci de vos conseils en tout cas, ca m'a mis sur la piste !


---------------
SHOOT ME AGAIN WEBZINE
Reply

Sujets relatifs:

Leave a Replay

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