Avatar billede folmerdude Nybegynder
22. maj 2009 - 18:41 Der er 8 kommentarer

Fatal error: Allowed memory size of..

Hej, jeg har lavet et script der skal uploade billeder, men får når billedet er for stort denne error:


Fatal error: Allowed memory size of 25165824 bytes exhausted (tried to allocate 10368 bytes) ...

Hvilket virker ret underligt. den skriver at "Allowed memory" er 25165824 og billedet er 10368 hvilket for mit vedkommende ikke rigtig giver mening. hvad gør jeg forkert?

Jeg har webhotel hos one.com og jeg har læst om at man skal ændre noget i php.ini men den har jeg ikke liggende på min server. Hjælp
Avatar billede folmerdude Nybegynder
22. maj 2009 - 20:01 #1
Jeg har forsøgt mig med noget imagedestroy(); men det ser ikke ud til at ændre noget.. Her er min resize kode:


              $imagename = $_FILES['minfil']['name'];
              $source = $_FILES['minfil']['tmp_name'];
              $target = "images/kreationer/".$imagename;
              move_uploaded_file($source, $target);
              $imgext = strrchr($_FILES['minfil']['name'], ".");
              $imagepath = $imagename;


//// CROP TIL MAX 800 PX
              $save = "images/kreationer/".$gruppe_nr."_800px_".$imagepath; //This is the new file you saving
              $file = "images/kreationer/".$imagepath; //This is the original file

              list($width, $height) = getimagesize($file) ;

              if ($width > 800) {
              $modwidth = 800; } else {
              $modwidth = $width; }

              $diff = $width / $modwidth;

              $modheight = $height / $diff;
              $tn = imagecreatetruecolor($modwidth, $modheight) ;
             
             
        if ($imgext == ".png" || $imgext == ".PNG" ) {
              $image = imagecreatefrompng($file) ;
              imagecopyresampled($tn, $image, 0, 0, 0, 0, $modwidth, $modheight, $width, $height) ;
              imagepng($tn, $save, 5) ;
             
              imagedestroy($tn);
              imagedestroy($save);
              }
        if ($imgext == ".jpg" || $imgext == ".JPG" || $imgext == ".jpeg" || $imgext == ".JPEG" ) {
              $image = imagecreatefromjpeg($file) ;
              imagecopyresampled($tn, $image, 0, 0, 0, 0, $modwidth, $modheight, $width, $height) ;
              imagejpeg($tn, $save, 90) ;
             
              imagedestroy($tn);
              imagedestroy($save);
              }
        if ($imgext == ".gif" || $imgext == ".GIF" ) {
              $image = imagecreatefromgif($file) ;
              imagecopyresampled($tn, $image, 0, 0, 0, 0, $modwidth, $modheight, $width, $height) ;
              imagegif($tn, $save, 5) ;
           
              imagedestroy($tn);
              imagedestroy($save);
              }
             
           
//// CROP TIL MAX 400 PX
              $save = "images/kreationer/".$gruppe_nr."_400px_".$imagepath; //This is the new file you saving
              $file = "images/kreationer/".$imagepath; //This is the original file

              list($width, $height) = getimagesize($file) ;

              if ($width > 400) {
              $modwidth = 400; } else {
              $modwidth = $width; }
              $diff = $width / $modwidth;
              $modheight = $height / $diff;
              $tn = imagecreatetruecolor($modwidth, $modheight) ;
             
             
        if ($imgext == ".png" || $imgext == ".PNG" ) {
              $image = imagecreatefrompng($file) ;
              imagealphablending($png, false);
              imagesavealpha($png, true);
              imagecopyresampled($tn, $image, 0, 0, 0, 0, $modwidth, $modheight, $width, $height) ;
              imagepng($tn, $save, 5) ;
             
              imagedestroy($tn);
              imagedestroy($save);
              }
        if ($imgext == ".jpg" || $imgext == ".JPG" || $imgext == ".jpeg" || $imgext == ".JPEG" ) {
              $image = imagecreatefromjpeg($file) ;
              imagecopyresampled($tn, $image, 0, 0, 0, 0, $modwidth, $modheight, $width, $height) ;
              imagejpeg($tn, $save, 90) ;
           
              imagedestroy($tn);
              imagedestroy($save);
              }
        if ($imgext == ".gif" || $imgext == ".GIF" ) {
              $image = imagecreatefromgif($file) ;
              imagecopyresampled($tn, $image, 0, 0, 0, 0, $modwidth, $modheight, $width, $height) ;
              imagegif($tn, $save, 5) ;
             
              imagedestroy($tn);
              imagedestroy($save);
              }

             
           
//// Resize TIL MAX 140 PX
              $save = "images/kreationer/".$gruppe_nr."_140px_".$imagepath; //This is the new file you saving
              $file = "images/kreationer/".$imagepath; //This is the original file

              list($width, $height) = getimagesize($file) ;

              if ($width >= $height) {
             
              if ($width > 140) {
              $modwidth = 140; } else {
              $modwidth = $width; }

              $diff = $width / $modwidth;
              $modheight = $height / $diff;
             
              } else {
              if ($height > 140) {
              $modheight = 140; } else {
              $modheight = $height; }

              $diff = $height / $modheight;
              $modwidth = $width / $diff;
              }              

              $tn = imagecreatetruecolor($modwidth, $modheight) ;
             
             
             
        if ($imgext == ".png" || $imgext == ".PNG" ) {
              $image = imagecreatefrompng($file) ;
              imagecopyresampled($tn, $image, 0, 0, 0, 0, $modwidth, $modheight, $width, $height) ;
              imagepng($tn, $save, 5) ;
             
              imagedestroy($tn);
              imagedestroy($save);
              }
        if ($imgext == ".jpg" || $imgext == ".JPG" || $imgext == ".jpeg" || $imgext == ".JPEG" ) {
              $image = imagecreatefromjpeg($file) ;
              imagecopyresampled($tn, $image, 0, 0, 0, 0, $modwidth, $modheight, $width, $height) ;
              imagejpeg($tn, $save, 90) ;
             
              imagedestroy($tn);
              imagedestroy($save);
              }
        if ($imgext == ".gif" || $imgext == ".GIF" ) {
              $image = imagecreatefromgif($file) ;
              imagecopyresampled($tn, $image, 0, 0, 0, 0, $modwidth, $modheight, $width, $height) ;
              imagegif($tn, $save, 5) ;
             
              imagedestroy($tn);
              imagedestroy($save);
              }
Avatar billede acore Ekspert
22. maj 2009 - 23:43 #2
Det er de sidste 10368 byte, der gør, at du overskriver grænsen for hvor memory du kan allokere (24 Mb). Læs mere her: http://dk2.php.net/manual/en/ini.core.php#ini.memory-limit. Du kan ikke regne med billedets størrelse, for det fylder meget mere i ukomprimeret form. 24 Mb lyder af meget, men prøv at gange pixels på hver led med antal farver, og regn det om til Mb - det bliver let et meget stort tal.

Hos one.com kan du desværre ikke ændre grænsen, der i forvejen er sat lavt hos dem (i forhold til andre) - 16 Mb da jeg undersøgte det - ser ud til at det er 24 Mb hos dig - og for lavt til at man kan håndtere billeder af en vis (rimelig) størrelse.

Skift til servage (vist ingen limit), gigahost (128 Mb), surftown (32 Mb), eller nogen andre, der tilbyder en - på det område - tidssvarende løsning.

Det kan ikke løses hos one.com, tror jeg. Du kan da prøve at spørge dem, men mon ikke du får samme svar, som jeg fik.
Avatar billede folmerdude Nybegynder
22. maj 2009 - 23:56 #3
Okay, så det du siger er at den eneste udvej er at skifte udbyder, og du anbefaler Servage eller Gigahost?
Avatar billede folmerdude Nybegynder
23. maj 2009 - 00:02 #4
Jeg forsøgte forresten at ligge det over på en lokalserver og satte tallet til 1280MB eller lign, og jeg fik stadig samme fejl.. Måske gjorde jeg det bare forkert..

Nogen der ahr forstand på koden, for måske kan det også være den, hvem ved..
Avatar billede acore Ekspert
23. maj 2009 - 10:45 #5
Ja, det er præcis hvad jeg siger. Det kræver selvfølgelig, at du ikke prøver at allokere mere memory end deres grænse.

Jeg har ikke prøvet gigahost, men kører nu også på servage. Servage har tidligere haft en del problemer, men der har ikke været mange den sidste tid. De er mere fleksible mht opsætning end de fleste hosts. Jeg har været ret tilfreds. Især hvis man med tiden får flere domæner og/eller subdomæner. Jeg kender ikke andre i den prisklasse der tilbyder samme fleksibilitet og funktionalitet.

Du kan bruge http://www.servage.net/?coupon=cust67775 - så får du 75 Gb ekstra plads når du bestiller.
Avatar billede dkfire Nybegynder
23. maj 2009 - 11:40 #6
Der er mindst et par fejl i din kode som den er nu.

Du skal udskifte alle:
imagedestroy($save);
med:
imagedestroy($image);

da $save ikke indeholder en billed resurse, men bare en sti.
$image indeholder derimod en billed resurse og skal derfor nedlægges når du ikke bruger den mere.

Men hvor store er dine billeder i pixel som du prøver at behandle ?
Avatar billede folmerdude Nybegynder
23. maj 2009 - 14:58 #7
Det er lidt forskelligt da det er brugere der uploader, så det er ikke rigtig til at sige..

Men tak for hjælp til koden.
Avatar billede dkfire Nybegynder
25. maj 2009 - 18:01 #8
Jeg vil anbefale dig så at lave et tjek på hvor store de billeder som brugerne uploader, og så afgøre ud fra det om du kan resize dem eller brugeren skal uploade et mindre billede.
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