1
Guten morgen allerseits,
ich sitze momentan über einem Bild-Upload-Script.
Das Script soll ein Bild auf den Webserver laden, und dort zwei unterschiedliche große Versionen erstellen.
Das funktioniert auch prima.
Allerdings leider nur mit Bildern mit einer Dateigröße unter 50 kByte.
Bei größeren Bildern sagt er mir "Fatal error: Allowed memory size of 41943040 bytes exhausted (tried to allocate 2580 bytes) in ...".
Lasse ich nur einmal verkleinern geht es auch mit 1 MByte großen Bildern.
Meine Vermutung ist, dass er das hochgeladene Bild mehrfach erstellt und den Speicher dazwischen nicht freigibt.
Da er das unkomprimiert tut stoße ich bei einer Upload size in der php.ini von 40 M natürlich schnell an eine Grenze.
Meine Frage ist also wie ich es hinbekomme, dass er nach dem ersten Verkleinern den Speicher wieder freigibt und dann erst die anderen beiden Komprimierungen durchführt.
Anbei ein wenig Quellcode (die IF-Abfragen um zu verhindern, dass er zu kleine Bilder vergrößert habe ich hier weggelassen):
$timestamp = time();
$dest1 = $timestamp.".jpg";
//ANFANG: 150px grosse Bilder generieren
$bildinfo_thumb_klein = GetImageSize($tmpbild);
$bildtyp_thumb_klein = $bildinfo_thumb_klein[2];
$hoehe2_thumb_klein = 150*$bildinfo_thumb_klein[1]/$bildinfo_thumb_klein[0];
$neuesBild_thumb_klein=imagecreatetruecolor(150,$hoehe2_thumb_klein);
$dest_thumb_klein = $_SERVER['DOCUMENT_ROOT']."img/thumbnails_klein/".$dest1;
copy($tmpbild,$dest_thumb_klein);
$altesBild_thumb_klein=imagecreatefromjpeg($dest_thumb_klein);
imagecopyresampled($neuesBild_thumb_klein,$altesBild_thumb_klein,0,0,0,0,150,$hoehe2_thumb_klein,$bildinfo_thumb_klein[0],$bildinfo_thumb_klein[1]);
imagejpeg($neuesBild_thumb_klein,$dest_thumb_klein,80);
clearstatcache();
//ENDE: 150px grosse Bilder generieren
//ANFANG: 350px grosse Bilder generieren
$bildinfo_thumb = GetImageSize($tmpbild);
$bildtyp_thumb = $bildinfo_thumb[2];
$hoehe2_thumb = 350*$bildinfo_thumb[1]/$bildinfo_thumb[0];
$neuesBild_thumb=imagecreatetruecolor(350,$hoehe2_thumb);
$dest_thumb = $_SERVER['DOCUMENT_ROOT']."img/thumbnails/".$dest1;
copy($tmpbild,$dest_thumb);
$altesBild_thumb=imagecreatefromjpeg($dest_thumb);
imagecopyresampled($neuesBild_thumb,$altesBild_thumb,0,0,0,0,350,$hoehe2_thumb,$bildinfo_thumb[0],$bildinfo_thumb[1]);
imagejpeg($neuesBild_thumb,$dest_thumb,80);
clearstatcache();
//ENDE: 350px grosse Bilder generieren
//ANFANG: 645 grosse Bilder generieren
$bildinfo = GetImageSize($tmpbild);
$bildtyp = $bildinfo[2];
$hoehe2 = 645*$bildinfo[1]/$bildinfo[0];
$neuesBild=imagecreatetruecolor(645,$hoehe2);
$dest = $_SERVER['DOCUMENT_ROOT']."img/".$dest1;
copy($tmpbild,$dest);
$altesBild=imagecreatefromjpeg($dest);
imagecopyresampled($neuesBild,$altesBild,0,0,0,0,645,$hoehe2,$bildinfo[0],$bildinfo[1]);
imagejpeg($neuesBild,$dest,80);
clearstatcache();
//ENDE: grosses Bild generieren
ich sitze momentan über einem Bild-Upload-Script.
Das Script soll ein Bild auf den Webserver laden, und dort zwei unterschiedliche große Versionen erstellen.
Das funktioniert auch prima.
Allerdings leider nur mit Bildern mit einer Dateigröße unter 50 kByte.
Bei größeren Bildern sagt er mir "Fatal error: Allowed memory size of 41943040 bytes exhausted (tried to allocate 2580 bytes) in ...".
Lasse ich nur einmal verkleinern geht es auch mit 1 MByte großen Bildern.
Meine Vermutung ist, dass er das hochgeladene Bild mehrfach erstellt und den Speicher dazwischen nicht freigibt.
Da er das unkomprimiert tut stoße ich bei einer Upload size in der php.ini von 40 M natürlich schnell an eine Grenze.
Meine Frage ist also wie ich es hinbekomme, dass er nach dem ersten Verkleinern den Speicher wieder freigibt und dann erst die anderen beiden Komprimierungen durchführt.
Anbei ein wenig Quellcode (die IF-Abfragen um zu verhindern, dass er zu kleine Bilder vergrößert habe ich hier weggelassen):
$timestamp = time();
$dest1 = $timestamp.".jpg";
//ANFANG: 150px grosse Bilder generieren
$bildinfo_thumb_klein = GetImageSize($tmpbild);
$bildtyp_thumb_klein = $bildinfo_thumb_klein[2];
$hoehe2_thumb_klein = 150*$bildinfo_thumb_klein[1]/$bildinfo_thumb_klein[0];
$neuesBild_thumb_klein=imagecreatetruecolor(150,$hoehe2_thumb_klein);
$dest_thumb_klein = $_SERVER['DOCUMENT_ROOT']."img/thumbnails_klein/".$dest1;
copy($tmpbild,$dest_thumb_klein);
$altesBild_thumb_klein=imagecreatefromjpeg($dest_thumb_klein);
imagecopyresampled($neuesBild_thumb_klein,$altesBild_thumb_klein,0,0,0,0,150,$hoehe2_thumb_klein,$bildinfo_thumb_klein[0],$bildinfo_thumb_klein[1]);
imagejpeg($neuesBild_thumb_klein,$dest_thumb_klein,80);
clearstatcache();
//ENDE: 150px grosse Bilder generieren
//ANFANG: 350px grosse Bilder generieren
$bildinfo_thumb = GetImageSize($tmpbild);
$bildtyp_thumb = $bildinfo_thumb[2];
$hoehe2_thumb = 350*$bildinfo_thumb[1]/$bildinfo_thumb[0];
$neuesBild_thumb=imagecreatetruecolor(350,$hoehe2_thumb);
$dest_thumb = $_SERVER['DOCUMENT_ROOT']."img/thumbnails/".$dest1;
copy($tmpbild,$dest_thumb);
$altesBild_thumb=imagecreatefromjpeg($dest_thumb);
imagecopyresampled($neuesBild_thumb,$altesBild_thumb,0,0,0,0,350,$hoehe2_thumb,$bildinfo_thumb[0],$bildinfo_thumb[1]);
imagejpeg($neuesBild_thumb,$dest_thumb,80);
clearstatcache();
//ENDE: 350px grosse Bilder generieren
//ANFANG: 645 grosse Bilder generieren
$bildinfo = GetImageSize($tmpbild);
$bildtyp = $bildinfo[2];
$hoehe2 = 645*$bildinfo[1]/$bildinfo[0];
$neuesBild=imagecreatetruecolor(645,$hoehe2);
$dest = $_SERVER['DOCUMENT_ROOT']."img/".$dest1;
copy($tmpbild,$dest);
$altesBild=imagecreatefromjpeg($dest);
imagecopyresampled($neuesBild,$altesBild,0,0,0,0,645,$hoehe2,$bildinfo[0],$bildinfo[1]);
imagejpeg($neuesBild,$dest,80);
clearstatcache();
//ENDE: grosses Bild generieren