Avatar billede anderskm Nybegynder
02. februar 2010 - 20:23 Der er 1 kommentar og
1 løsning

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
Avatar billede majbom Novice
02. februar 2010 - 21:51 #1
som fejlen antyder, har du ikke hukommelse nok tilgængeligt, til at "redigere" i så stort et billede...
Avatar billede anderskm Nybegynder
02. februar 2010 - 22:16 #2
Ved søgning her på eksperten fandt jeg selv løsningen.
Fejlen er som splazz skriver, at der ikke er hukommelse nok. Jeg kunne ikke ændre hukommelses størrelsen med ini_set("memory_limit","75M"); men smed følgende linje ind i .htaccess
php_value memory_limit 75M

Jeg fandt løsningen i denne tråd:
http://www.eksperten.dk/spm/695501
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester