Allowed memory size exhausted
Jeg har lavet et script, hvormed jeg kan uploade billeder. Billedet gemmes i fuld størrelse på serveren samt i en 730px og 150px udgave, hvor den største side sættes lig 730/150px og den anden side skaleres efter dette. Desuden gemmes nogle informationer om billedet i en MySQL database.Scriptet er opbygget hierarkisk, så den først udfører en "kommando", og hvis denne går godt, udfører den den næste.
Rækkefølgen af "kommandoer":
1. Indsæt data i database
2. Flyt billede fra midlertidig folder
3. Generer 730px billede
4. Generer 150px billede
Jeg har kunnet uploade billeder på størrelser op til 3032x1900 uden problemer, men med et billede af størrelsen på 4282x2881 får jeg fejlen:
Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 17128 bytes) in ...
Jeg kan på servere se at værdierne er indsat i databasen, og billedet i fuld størrelse ligger i den mappe det skal, men de to sidste billeder er ikke genereret. Fejlen må derfor ligge i den funktion (se nedenfor) jeg bruger til at generere mit 730px billede. Dette stemmer også overens med den reference jeg får i fejlbeskeden.
Jeg ved at problemet sandsynligvis kan løses med ini_set("memory_limit","75M"); , men kan problemet løses på en anden er måske mere elegant måde? Har jeg eventuelt glemt noget/gjort noget forkert i min kode, der gør at den sluger så meget hukommelse, eller er det simpelthen bare fordi jeg arbejder med et billede af den størrelse?
// kode start
function imageResize($filename,$newFilename,$width,$height,$keepratio)
{
$imageInfo = getimagesize($filename);
if (($imageInfo['mime'] == 'image/jpeg') && (!file_exists($newFilename)))
{
$newWidth = $width;
$newHeight = $height;
if ($keepratio == true)
{
if ($imageInfo['0'] >= $imageInfo['1']) {
$scale = $width / $imageInfo['0'];
$newWidth = $width;
$newHeight = $imageInfo['1'] * $scale;
}
else {
$scale = $height / $imageInfo['1'];
$newHeight = $height;
$newWidth = $imageInfo['0'] * $scale;
}
}
$imgOld = ImageCreateFromJPEG($filename);
$imgNew = imagecreatetruecolor($newWidth,$newHeight);
imagecopyresized($imgNew,$imgOld,0,0,0,0,$newWidth,$newHeight,$imageInfo['0'],$imageInfo['1']);
if (imagejpeg($imgNew,$newFilename))
{
imagedestroy($imgOld);
imagedestroy($imgNew);
return true;
}
else
{
imagedestroy($imgOld);
imagedestroy($imgNew);
return false;
}
}
else
{
return false;
}
}
// kode slut