Klaus: Speicherüberlauf bei Thumbnail-Erstellung

Hallo,
ich habe einen kleinen Bereich bei dem man Fotos, z.B. Urlaubfotos, hochladen kann.
Da solche Fotos meistens viel zu Groß sind (2500 x 2000 Pixel) möchte ich die per PHP schrumpfen lassen, auf 640x480 Pixel.

Das Hochladen solcher großen Fotos (bis 640x480 gibts keine Probleme) ist kein Problem, allerdings verursacht die Thumbnailfunktion immer einen Speicherüberlauf:

Fatal error: Allowed memory size of 25165824 bytes exhausted (tried to allocate 3000 bytes) in /script.php on line 42

Meine Thumbnail-Funktion

  
<?php  
//  
$thumb = imagecreate (640,480);  
imageJPEG($thumb,"./bilder/temp.jpg");  
$thumb = imagecreatefromjpeg("./bilder/temp.jpg");  
  
//Folgende Funktion verursacht den Fatal-Error  
$imgCreate = imagecreatefromjpeg($source);  
?>

Leider bin ich bei einem shared Hoster, so dass ich keine Möglichkeit habe, an der php.ini rumzuspielen.

Ein ini_set("memory_limit","64M"); bewirkt leider auch nichts.

Jetzt wollte ich versuchen, meinen Script sparsamer zu schreiben, so dass kein Überlauf entsteht.
Hat jmd. eine Idee, wie ich da vor gehen kann?

Bisher ist das so, dass ich direkt nach dem Upload versuche das Bild zu verkleinern.
Kann es sein, dass dieser Upload schon viel Platz verbraucht?

Ich hoffe auf Hilfe.

MFG

  1. Zu wenig Arbeisspeicher. So große Bilder verbrauchen um die ~30Mb Arbeisspeicher und der reicht wohl bei dir nicht. Ich weiß nicht ob es noch andere möglichkeiten gibt. Ich könnte mir höchstens vorstellen, dass das Bild vorher geteilt wird (ohne vollständig in den RAM geladen zu werden), dann verarbeitet und dann wieder zusammengefügt wird. Aber die PHP Profis hier können die wohl besser helfen als ich.

  2. hi,

    Jetzt wollte ich versuchen, meinen Script sparsamer zu schreiben, so dass kein Überlauf entsteht.
    Hat jmd. eine Idee, wie ich da vor gehen kann?

    Ausser, dass du nicht mehr benötigte Image-Ressourcen sofort wieder entsorgst (imagedestroy), ist da nicht allzu viel rauszuholen.
    Und das ist idR. auch nur dann relevant, wenn du mehrere Bilder hintereinander in einer Scriptinstanz bearbeitest.

    Bisher ist das so, dass ich direkt nach dem Upload versuche das Bild zu verkleinern.
    Kann es sein, dass dieser Upload schon viel Platz verbraucht?

    Das Bild zu entpacken, um es bearbeiten zu können, braucht Platz.
    True Color bedeutet 3 Byte pro Pixel, und bei 2500 x 2000 Pixel Größe macht das schon 14,31 MB.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Hallo,

      Ausser, dass du nicht mehr benötigte Image-Ressourcen sofort wieder entsorgst (imagedestroy), ist da nicht allzu viel rauszuholen.

      Ja ImageDestroy verwende ich, der Code sieht komplett so aus:

        
      //Paar Bildinfos sammeln  
      $thumb = imagecreate (640,480);  
      imageJPEG($thumb,"./bilder/temp.jpg");  
      thumb = imagecreatefromjpeg("./bilder/temp.jpg");  
      $imgCreate = imagecreatefromjpeg($source);  
      imagecopyresized($thumb, $imgCreate, 0, 0, 0, 0, 640, 480, $width, $height);  
      imagejpeg($thumb,$speicherort,90);  
        
      ImageDestroy($imgCreate);  
      ImageDestroy($thumb);  
      
      

      Was mich stutzig macht, ist dass: ini_set("memory_limit", "-1"); (o.ä.) nicht funktioniert, obwohl --enable-memory-limit laut phpinfo() beim kompilieren verwendet wurde (PHP 5.1.6).

      Wenn ich die Einstellung per ini_set (htaccess geht nicht, da kein Apache Modul) verändern möchte, übernimmt PHP es allerdings nicht, ini_get() sagt weiterhin 24 MB.

      MFG

      1. hi,

        Was mich stutzig macht, ist dass: ini_set("memory_limit", "-1"); (o.ä.) nicht funktioniert, obwohl --enable-memory-limit laut phpinfo() beim kompilieren verwendet wurde (PHP 5.1.6).

        Ist es denn "dein" Server?
        In Shared Hosting-Umgebungen wird die Änderbarkeit solcher Einstellungen ja auch oft deaktiviert.

        (htaccess geht nicht, da kein Apache Modul)

        In der CGI-Variante geht es doch AFAIK, wenn man eine eigene php.ini ins Verzeichnis legt (sofern nicht ebenfalls unterbunden).

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
  3. Ich grüsse den Cosmos,

    Jetzt wollte ich versuchen, meinen Script sparsamer zu schreiben, so dass kein Überlauf entsteht.
    Hat jmd. eine Idee, wie ich da vor gehen kann?

    Ja. Mach die Bilder vor dem Hochladen kleiner. Wie gross ein Bild im Speicher wird, kannst du ja selbst ausrechnen (Höhe x Breite x Farbtiefe). Dann weisst du auch sofort, wie gross das Bild sein darf, das du umrechnest.

    Möge das "Self" mit euch sein

    --
    Fragt ein Atom das andere: Hast du mein Elektron gesehen? Ich bin heute so positiv.
    ie:{ br:> fl:| va:| ls:& fo:{ rl:( n4:{ de:] ss:) ch:? js:| mo:) sh:( zu:)
    1. Hallo,

      Ja. Mach die Bilder vor dem Hochladen kleiner.

      Das Problem ist, dass ich nicht der Nutzer dieser Anwendung sein werde, sondern bloß der Programmierer bin.

      Für den Nutzer/Kunde ist es natürlich praktikabler, wenn er die Bilder direkt von der Kamera hochladen kann, ohne sie vorher verkleinern zu müssen.

      MFG