webForumDet fria alternativet

Minnesbrist vid bildhantering

4 svar · 517 visningar · startad av niNe

niNeMedlem sedan maj 2005138 inlägg
#1

Tjenare

Har fått lite problem med minnet på servern när jag laddar upp och skalar om bilder. Allt funkar kanon med bilder i storleksordningen upp till 10-12MP, men sen blire Fatal Error: Allowed memory size of x bytes exhausted.

Kör idag 64MB på servern, och det är vad jag max får använda mig av.

Kod enligt följande:

<?php
        mkdir ("../img/news/".$_SESSION['date']."_".$_SESSION['news_id'], 0755, true);
		$file_count = count($_FILES['ufile']['name']);
		for ($i=0; $i<$file_count; $i++) {
			if($_FILES['ufile']['error'][$i] == 0){	
				$path=("../img/news/".$_SESSION['date']."_".$_SESSION['news_id'].'/'.$_FILES['ufile']['name'][$i]);
				$pathcrop=("../img/news/".$_SESSION['date']."_".$_SESSION['news_id'].'/');
				copy($_FILES['ufile']['tmp_name'][$i], $path);
				chmod($path, 0755);
					$filename = $path;
					$fileout =  $path; 
					$width = 640;
					$height = 480;
					
					list($width_orig, $height_orig) = getimagesize($filename);
					$ratio_orig = $width_orig/$height_orig;
					
					if ($width/$height > $ratio_orig) {
					   $width = $height*$ratio_orig;
					} else {
					   $height = $width/$ratio_orig;
					}
					
					$image_p = imagecreatetruecolor($width, $height);
					$image = imagecreatefromjpeg($filename);
					imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
					
					imagejpeg($image_p, $fileout, 80);
					imagedestroy($image);
					echo "<a href=step4.php?path=$pathcrop&filename=".$_FILES['ufile']['name'][$i]."'><img src=\"$path\" width=\"150\" height=\"113\" border=\"0\">&nbsp;&nbsp;</a>";
				unset($path,$pathcrop,$filename,$fileout,$width,$height,$radio_orig,$width_orig,$height_orig,$image_p,$image);
			}
		}
        ?>

Finns det något sätt att optimera på så användarna kan ladda upp stora filer utan att manuellt behöva skala ner dom?

jmeMedlem sedan maj 20012 237 inlägg
#2

Jag hade samma problem. Var tvungen att skapa thumbnails på bilder som var uppemot 80 Mb stora. Jag började få problem när bilderna var 12Mb+ stora.

Jag var tvungen att höja PHPs minnesgräns till typ 900Mb, innan det började fungera.

En annan orsak var också att man hade glömt att läga till imagedestroy() efter att man var klar med en viss bild. Se till att du har imagedestroy() där det behövs för annars äter PHP upp allt minne om du har för många bilder.

Här kan det vara bra att nämna att kravet på minneshöjningen kan ha delvis berott på just att imagedestroy() fattades,

Verkar som du använder GD för att manipulera bilder. Vad jag läst så är GD inte alltför optimerad vad gäller minnesanvändningen. Imagemagick sall vara bättre på det.

niNeMedlem sedan maj 2005138 inlägg
#3

Hmm, mja, fast nu verkar de va något annat vajsing... För idag kan jag inte ens ladda upp två bilder som är 1,4-1,5MB stora utan att få minnesbrist... Känns som ett problem som bör ligga hos hotellet... Eller?

fiddlerMedlem sedan juli 20023 617 inlägg
#4

Det är inte antalet MB som avgör utan antalet pixlar som sätter gränsen. Jämför hur stora bilderna blir om du konverterar dem till BMP istället för JPG. PHP packar upp bilderna till sitt eget format, som jag antar är jämförbart med BMP, och det är väl där minnesåtgången sker. Lösningen vore att ändra i php.ini, men det kanske du inte har möjlighet att göra.

niNeMedlem sedan maj 2005138 inlägg
#5

Nej, det är en delad server, så jag är tyvärr begränsad till 64MB för processer.

135 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)