[PHP] Plaatje verkleinen, te weinig geheugen ter beschikking

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een functie geschreven die afbeeldingen resized en ze wegschrijft naar een vooraf bepaalde locatie. Op mijn eigen server is dit geen probleem, maar de server waar het script uiteindelijk gehost moet worden werkt niet bepaald mee...


PHP: _code.php
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
function storePic($o_file, $r_width, $filename) {
    global $root, $dataFolder, $uploadFolder;
    
    $original = imagecreatefromjpeg($root.$uploadFolder.$o_file);
    
    $o_width = imagesx($original);
    $o_height = imagesy($original);
    $r_height = round($o_height * $r_width / $o_width);

    $resized = imagecreatetruecolor($r_width, $r_height);
    $watermark = imagecreatefromgif("_watermark.gif"); 
    
    imagecopyresampled($resized, $original, 0, 0, 0, 0, $r_width, $r_height, $o_width, $o_height);
    imagecopymerge($resized, $watermark, 0, 0, 0, 0, $r_width, $r_height, 25);
    
    imagejpeg($resized, $root.$dataFolder.$filename);
    
    imagedestroy($original);
    imagedestroy($resized);
    imagedestroy($watermark);
}


Bij het uitvoeren van het script met kleine bestanden is er niets aan de hand, werkt als een zonnetje! Helaas krijg ik wanneer de bestandsgrootte toeneemt de volgende foutmelding:
Fatal error: Allowed memory size of 10485760 bytes exhausted (tried to allocate 1600 bytes) in _data.php on line 53
Hieruit maak ik op dat het script teveel geheugen vreet. Vreemd, want dit gebeurt al wanneer ik een foto van 500kb probeer te verwerken... Het bestand _watermark.gif is overigens slechts 16kb.

Heeft er iemand advies over hoe ik dit probleem kan omzeilen danwel oplossen? Of wellicht tips om het script in het algemeen wat beter te laten worden? Ik vond het nogal vreemd namelijk dat die 10MB zo snel verbruikt waren :)

Acties:
  • 0 Henk 'm!

Verwijderd

Bedenk even dat die JPEG gedecomprimeerd moet worden, en dan neemt elke pixel dus weer 24 bits in beslag, (of 32) als je er ook een alpha channel bij hebt. Een goed gecomprimeerde JPEG kan ongecomprimeerd best een stuk of wat malen groter zijn, een keer of 8 is niet vreemd. Doe even datzelfde met een GIF watermark (indexed color, dus 1 byte per pixel + wat overhead), en ook nog eens een geresizede 3e afbeelding. Met wat pech zit je dus echt zo aan 10 MB geheugen als het om grotere bestanden gaat. En 500 KB aan JPEG is al best wat.

Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
al gezocht?

probeer je script bijv. wat anders in te delen. zoals je kan lezen in de manual maak je memory vrij met imagedestroy

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ah, dat heldert al een hoop op. 500 KB is best wat inderdaad, maar het gaat om foto's die geupload worden. Een betere optie zou dus zijn om een limiet in te stellen wat betreft bestandsgrootte?

Acties:
  • 0 Henk 'm!

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

ImageDestroy() mag je best halverwege je script gebruiken, na het resizen kan je bijvoorbeeld best $original al destroyen/unsetten. :)

Sole survivor of the Chicxulub asteroid impact.


Acties:
  • 0 Henk 'm!

  • Borizz
  • Registratie: Maart 2005
  • Laatst online: 24-08 20:35
Zodra je de afbeelding met GD inleest, wordt deze als een 24 bits bitmap in het geheugen opgeslagen, een afbeelding van 1600 x 1200 pixels neemt dan al 5760000 bytes (meer dan 5 MB) in beslag. Nu ga je deze nog resizen en heb je een geresized kopie van deze afbeelding ook in het geheugen staan (kost ook weer geheugen). Dan ga je nog een watermark toevoegen enz (wordt ook door GD ingeladen) en ben je zo 10MB verder :) .

Dus afhankelijk van je input afbeeldingen en de grootte waarnaar ze geresized worden zit je zo aan die 10MB memory limit. Je kan in je script zoiets doen als:

PHP:
1
ini_set("memory_limit", "32M"); // set memorylimit to 32 MB


om de memory limit te verhogen, maar dan moet je hoster dit wel toestaan (site mag niet in safe mode draaien).

If I can't fix it, it ain't broken.

Pagina: 1