problème PHP : Fatal error: Allowed memory size

alpking

Membre actif
13 Mai 2005
142
4
45
bonsoir,

lorsque j'essaie d'uploader une image (JPG, 2.9MB, 3456x2304 px) avec le script suivant, j'obtient cette erreur :

Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 13824 bytes) in /home/www/b7592a9d050f4b86f67ae26685348f5a/web/test/html/upload.php on line 111

Bloc de code:
<?php

ini_set("memory_limit","20M");

?>

<?php
//----------------------------
// DEFINITION DES VARIABLES
//----------------------------
 
//Pour les tester en local (avec EasyPHP,...)
$test_local = 0; //0 pour le web                                                    //N'effectue pas la r&#233;alocation de la m&#233;moire du serveur
                                                                                                                    //et n'envoi pas de mail de confirmation
 
$extension = 'image/pjpeg'; // MIME JPEG pour la comparaisond de l'extention du fichier
$extension2 = 'image/jpeg'; // MIME JPEG pour la comparaisond de l'extention du fichier
							//$extension3 = 'image/png'; // AFIN DE REJOUTER DES EXTENSIONS // VOIR EGALEMENT LIGNE 102 // ATTENTION, LE GD MARCHE SEULEMENT AVEC JPG
							//$extension4 = 'image/gif';
$quality = 100; // Qualit&#233; de la compression JPEG
$kb_max = 70000; // Valeur max en octets de l'image finale
$max_size = 50000000; // Taille max en octets du fichier &#224; uploader pour traitement
$largeurDestination = 466; // Largeur max de l'image finale en pixel
$nom_rep = "upload"; // Lien du r&#233;pertoire des dossier photos &#224; la ra&#231;ine du script (fin sans /)
$site = "http://".$_SERVER["HTTP_HOST"]."/test/html/"; // Adresse du dossier o&#249; est install&#233; le script (fin avec /)

 
//---------------------------------------------
// DEFINITION DES VARIABLES LIEES AUX FICHIERS
//---------------------------------------------
 
$nom_file = $_FILES['fichier']['name'];
$taille = $_FILES['fichier']['size'];
$tmp = $_FILES['fichier']['tmp_name'];
$ext_img            =    $_FILES['fichier']['type'];
$verif_exist = $nom_rep;
$verif_exist .= "/";
$verif_exist .= $nom_file;
       
//----------------------
// SCRIPT D'UPLOAD
//----------------------
 

                
//Enlever les accents
//*******************
function enlever_accents($dest_fichier){
$dest_fichier = strtr($dest_fichier, '&#192;&#193;&#194;&#195;&#196;&#197;&#199;&#200;&#201;&#202;&#203;&#204;&#205;&#206;&#207;&#210;&#211;&#212;&#213;&#214;&#217;&#218;&#219;&#220;&#221;&#224;&#225;&#226;&#227;&#228;&#229;&#231;&#232;&#233;&#234;&#235;&#236;&#237;&#238;&#239;&#240;&#242;&#243;&#244;&#245;&#246;&#249;&#250;&#251;&#252;&#253;&#255;/',
                                     'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy/');
//remplacer les caracteres autres que lettres, chiffres et point par _
$dest_fichier = preg_replace('/([^.a-z\/0-9]+)/i', '_', $dest_fichier);
return $dest_fichier;
}
 
$nom_rep = enlever_accents($nom_rep);
$verif_exist = enlever_accents($verif_exist);
$nom_file = enlever_accents($nom_file);
 
//D&#233;but de la proc&#233;dure d'upload
//******************************
if($_POST['posted']) {
	  //On v&#233;rifie que le nom du fichier n'existe pas
	  if(!file_exists($verif_exist)) { 
        // On v&#233;rifie l'extension du fichier 
        if(($ext_img == $extension)||($ext_img == $extension2)) {   // ||($ext_img == $extension3)||($ext_img == $extension4) // A RAJOUTER POUR AJOUTER DES EXTENSION
           // On r&#233;cup&#232;re les dimensions du fichier
           $infos_img = getimagesize($tmp);
            // On v&#233;rifie la taille de l'image
			 if($taille <= $max_size) { 
               //upload du fichier
               if(move_uploaded_file($tmp,$nom_rep."/".$nom_file)) {
                    // Si upload OK alors on affiche le message de r&#233;ussite
                    chmod($verif_exist, 0777);
                    echo '<font color=#C19163 face="Arial, Helvetica, sans-serif" font size="2"><b>IMAGE UPLOADEE AVEC SUCCES !</b><br></font>';
                    echo '<hr />';
                    echo '<font color=#C19163 face="Arial, Helvetica, sans-serif" font size="1"><u>DETAILS DE L\'IMAGE D\'ORIGINE :</u><br></font>';
					echo '<br />';
					echo '<font color=#C19163 face="Arial, Helvetica, sans-serif" font size="1"><b>FICHIERS :</b> ', $nom_file , '<br /></font>';
					echo '<font color=#C19163 face="Arial, Helvetica, sans-serif" font size="1"><b>TAILLE :</b> ' , $taille, ' Octets<br /></font>';
					echo '<font color=#C19163 face="Arial, Helvetica, sans-serif" font size="1"><b>LARGEUR :</b> ', $infos_img[0], ' px<br /></font>';
					echo '<font color=#C19163 face="Arial, Helvetica, sans-serif" font size="1"><b>HAUTEUR :</b> ', $infos_img[1], ' px<br /></font>';
					echo '<hr />';
					 
					//calcul et redimension
					//*********************
					$fichierSource = $nom_rep;
					$fichierSource .= "/";
					$fichierSource .= $nom_file;
					$fichierSource = $fichierSource;
					//hauteur / largeur
					$rapport = $infos_img[1] / $infos_img[0];
					//Dimension de sortie
					$hauteurDestination = $largeurDestination * $rapport;
					 
					if($test_local == 0)
						{
						//R&#233;aloue la m&#233;moire dont le serveur &#224; besoin
						//*******************************************
						$memoryNeeded = round(($infos_img[0] * $infos_img[1] * $infos_img['bits'] * $infos_img['channels'] / 8 + Pow(2, 16)) * 1.65);
						$mem_in_use= memory_get_usage();
						//echo "M&#233;moire utilis&#233;e : $memoryNeeded contre $mem_in_use<br><br>";
						$test = (integer) ini_get('memory_limit') + ceil(((memory_get_usage() + $memoryNeeded) - (integer) ini_get('memory_limit') * pow(1024, 2)) / pow(1024, 2)) + 1;
						//solution calcul&#233;e
						if(function_exists('memory_get_usage') && memory_get_usage() + $memoryNeeded > (integer) ini_get('memory_limit') * pow(1024, 2))
						ini_set('memory_limit', (integer) ini_get('memory_limit') + ceil(((memory_get_usage() + $memoryNeeded) - (integer) ini_get('memory_limit') * pow(1024, 2)) / pow(1024, 2)) + 2 . 'M');
						}
						 
					//Cr&#233;ation de l'image
											//*******************
                    $source = imagecreatefromjpeg($fichierSource);
                     
                    $largeurSource = imagesx($source);
                    $hauteurSource = imagesy($source);
                                       
                    if($largeurSource > $largeurDestination){
                       $im = ImageCreateTrueColor ($largeurDestination, $hauteurDestination)
                            or die ("Erreur lors de la cr&#233;ation de l'image");
                    }
                    else{
                       $im = ImageCreateTrueColor ($infos_img[0], $infos_img[1])
                            or die ("Erreur lors de la cr&#233;ation de l'image");
                       $largeurDestination = $infos_img[0];
                       $hauteurDestination = $infos_img[1];
                    }
                       
                    //Redimentionnement
                    //*****************
                    ImageCopyResampled($im, $source, 0, 0, 0, 0, $largeurDestination, $hauteurDestination, $largeurSource, $hauteurSource);
                    
                    //Cr&#233;ation du fichier de sortie
                    //*****************************
                    $fh=fopen($fichierSource,'w');
                    fclose($fh);
                    ImageJpeg ($im,$fichierSource,$quality);
                    $size_file = filesize($fichierSource);
                    
                    //Test de la taille en kb de l'image d&#233;finitive
                    //*********************************************
                    $size_file = filesize($fichierSource);
                    $iteration = 0;
                    while($size_file > $kb_max){
                         if($quality > 0)$quality -= 5;
                         else {$quality = "Erreur!!!"; break;}
                       unlink($fichierSource);
                       $fh=fopen($fichierSource,'w');
					   fclose($fh);
					   ImageJpeg ($im,$fichierSource,$quality);
					   $size_file = filesize($fichierSource);
					   $iteration++;
					}
 
					//Affiche le d&#233;tail de l'image
					echo '<font color=#C19163 face="Arial, Helvetica, sans-serif" font size="1"><u>DETAILS DE L\'IMAGE FINALE SUR LE SERVEUR :</u><br></font>';
					echo '<br />';
					echo '<font color=#C19163 face="Arial, Helvetica, sans-serif" font size="1"><b>FICHIER :</b> ' , $nom_file, '<br /></font>';
					echo '<font color=#C19163 face="Arial, Helvetica, sans-serif" font size="1"><b>TAILLE :</b> ' , $size_file, ' Octets<br /></font>';
					echo '<font color=#C19163 face="Arial, Helvetica, sans-serif" font size="1"><b>QUALITE :</b> ' , $quality, ' %<br /></font>';
					echo '<font color=#C19163 face="Arial, Helvetica, sans-serif" font size="1"><b>LARGEUR :</b> ' , $largeurDestination, ' px<br /></font>';
					echo '<font color=#C19163 face="Arial, Helvetica, sans-serif" font size="1"><b>HAUTEUR :</b> ' , $hauteurDestination, ' px<br /></font>';
					echo '<hr />';
					echo '<font color=#C19163 face="Arial, Helvetica, sans-serif" font size="2"><b>ADRESSE DU FICHIER A COPIER DANS LA NEWS : </b>' , htmlspecialchars('<img src="http://www.gaptrading.ch/html/upload_clients/' . $nom_file . '"></font>');
					echo '<hr />';
					echo '<br />';
					$lien_image = $site.$nom_rep."/".$nom_file;
					echo '<font color=#C19163 face="Arial, Helvetica, sans-serif" font size="1">L\'IMAGE CI-DESSOUS A ETE REDIMENSIONEE ET UPLOADEE SUR LE SERVEUR AVEC SUCCES !<br><br></font>';
                    //echo "Lien de l'image : ".$lien_image."<br /><br />";
                    echo "<img border='0' src='".$lien_image."'><br />";
                    
                   
                       
				} else {
					// Sinon on affiche une erreur syst&#232;me
					echo '<font color=#C19163 face="Arial, Helvetica, sans-serif" font size="2"><b><u>ECHEC DE L\'ENVOI</u><br><br>PROBLEME LORS DE L\'UPLOAD !</b><br /><br /><b>Erreur num : '.$_FILES['fichier']['error']. '</b><br /><br /></font>';
						}
			} else {
				// Sinon on affiche une erreur pour les dimensions et taille de l'image
				echo '<font color=#C19163 face="Arial, Helvetica, sans-serif" font size="2"><b>LA TAILLE DU FICHIER DEPASSE LA TAILLE MAXIMAL AUTORISEE DE $max_size octets!</b><br /></font>';
					}
		} else {
			// Sinon on affiche une erreur pour l'extension
			echo '<font color=#C19163 face="Arial, Helvetica, sans-serif" font size="2"><b><u>ECHEC DE L\'ENVOI</u><br><br>VOTRE IMAGE NE COMPORTE PAS L\'EXTENSION .jpg !</b><br /></font>';
				}
	  } else {
			 //Sinon on demande de renommer
			 echo '<font color=#C19163 face="Arial, Helvetica, sans-serif" font size="2"><b><u>ECHEC DE L\'ENVOI</u><br><br>UNE IMAGE AVEC LE MEME NOM EXISTE DEJA ! RENOMMER L\'IMAGE ET RECOMMENCER !</b><br /></font>';
				}

}

?><body bgcolor="#2A1D13" text="#C19163">
      
 <form enctype="multipart/form-data" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
   <p>&nbsp;</p>
   <p><font size="3" face="Arial, Helvetica, sans-serif"><strong>INSERER UNE IMAGE DANS UNE NEWS  :</strong></font></p>
   <p><font color="#C19163"><strong><font size="1" face="Arial, Helvetica, sans-serif">FICHIERS AUTORISES : .jpg, .jpeg </font></strong></font></p>
   <p><font color="#C19163"><strong><font size="1" face="Arial, Helvetica, sans-serif">TAILLE MAXIMUM AUTORISEE POUR UN FICHIER : 45 MB  </font></strong></font><br />
     <br />
     <br>
     
         <font color="#C19163" face="Arial, Helvetica, sans-serif"><font size="1"><strong>SELECTIONNEZ L'IMAGE :</strong> </font></font>
         <font size="1" face="Arial">
         <input type="hidden" name="posted" value="1">
         </font>
         <input name="fichier" type="file">
     <br>
     <br>
     <input type="submit" value="Envoyer la photo" />
     </p>
	 <INPUT Type="Button" Value="Fermer la fen&ecirc;tre" onClick="javascript:parent.close()">
 </form>

Par contre l'image est upload&#233;e sur le server, donc comment faire pour regler ce probl&#232;me ?


merci d'avance de votre aide
 
caca
ini_set('memory_limit', (integer) ini_get('memory_limit') + ceil(((memory_get_usage() + $memoryNeeded) - (integer) ini_get('memory_limit') * pow(1024, 2)) / pow(1024, 2)) + 2 . 'M');

caca si tu redefinies plus que la valeur ds ton php.ini

t'es en train de faire un troyan dit moi