Roland: Speicherproblem beim Bildupload

Hallo liebe Experten,

ich habe ein php-technisches Problem bei einer Bilduploadfunktion.
Möglicherweise liegt es auch am Speicherplatz des Providers, jedenfalls kann ich mit folgender Meldung nichts anfangen:

"Allowed memory size of 20971520 bytes exhausted (tried to allocate 1999 bytes) in /home/..." on line 64

Es sollen insgesamt 2 Bilder mit den maximal-Maßen von 2000x2000 in einem Rutsch via post hochgeladen werden, der Fehler in der Zeile 64 (siehe Fehlermeldung oben!) läßt mich vermuten, dass der upload des 1. Bildes noch klappt, da in besagter Zeile 64 bereits das zweite Bild hochgeladen wird.

Hier der relevante code-Schnipsel:
-----------------------------------------
$Fotoquelle=$Bild2;
$Bildinfos = getimagesize($Fotoquelle);
$SollBreite = "400";
$Breite=$Bildinfos[0];
$Hoehe=$Bildinfos[1];
if ($Breite < 2000 and $Hoehe < 2000)
{
$SollHoehe=intval($Hoehe*$SollBreite/$Breite);
if($Bildinfos[2] == 1) $AltesBild=ImageCreateFromGIF($Fotoquelle);
if($Bildinfos[2] == 2) $AltesBild=ImageCreateFromJPEG($Fotoquelle); // = Zeile 64 die oben moniert wird!
------------------------------------------

Vielleicht kann mir ja schon jemand anhand der Fehlermeldung weiterhelfen und das Problem hat möglicherweise nichts mit php zu tun...

  1. Hi,

    ich habe ein php-technisches Problem bei einer Bilduploadfunktion.
    Möglicherweise liegt es auch am Speicherplatz des Providers, jedenfalls kann ich mit folgender Meldung nichts anfangen:

    "Allowed memory size of 20971520 bytes exhausted (tried to allocate 1999 bytes) in /home/..." on line 64

    Wieso kannst du damit nichts anfangen?
    Da steht doch klar und deutlich, dass dein Script den erlaubten Speicherverbrauch von 20MB ausgeschöpft hat.

    MfG ChrisB

    --
    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
    1. Ich verstehe leider immer noch Bahnhof.
      Ist mein Script (da habe ich Dateien mit mehr Platz/Codezeilen auf dem Server) zu lang, ist der ftp-Speicherplatz zu Ende?
      Bitte um Aufklärung auch wenn es für die meisten deutlich zu sein scheint!

      1. Hi,

        Ich verstehe leider immer noch Bahnhof.
        Ist mein Script (da habe ich Dateien mit mehr Platz/Codezeilen auf dem Server) zu lang, ist der ftp-Speicherplatz zu Ende?

        Der Speicherverbrauch im RAM ist höher, als erlaubt.

        MfG ChrisB

        --
        “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
        1. Ok, ich frage jetzt mal ganz doof:
          das soll heißen ich habe nicht genug Arbeitsspeicher frei und das script funktioniert eigentlich?
          Und falls dem so ist, kann man derartige Verfahren irgendwie optimieren?

          1. Hi,

            Ok, ich frage jetzt mal ganz doof:
            das soll heißen ich habe nicht genug Arbeitsspeicher frei

            -gegeben, ja.

            Es ist üblich, dass der Speicherverbrauch einzelner Scriptinstanzen vom Serverbetreiber limitiert wird, damit nicht einzelne Speicherfresser den anderen Nutzern alle Ressourcen klauen.

            und das script funktioniert eigentlich?

            Ja.

            Und falls dem so ist, kann man derartige Verfahren irgendwie optimieren?

            Bilder zu bearbeiten braucht viel Speicher - da gibt es per se wenig zu optimieren.

            Statt der GD-Lib könnte man es mit ImageMagick versuchen, sofern das installiert und per PHP ansteuerbar ist. Als externe Applikation aufgerufen unterläge das dann auch nicht den Speicherbeschränkungen von PHP.

            MfG ChrisB

            --
            “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
  2. Hallo,

    "Allowed memory size of 20971520 bytes exhausted (tried to allocate 1999 bytes) in /home/..." on line 64

    Es sollen insgesamt 2 Bilder mit den maximal-Maßen von 2000x2000 in einem Rutsch via post hochgeladen werden,

    das wird nicht gehen :-)

    Laut diesem Archivthread arbeitet die GD-Bibliothek mit einer Farbtiefe von 40 Bit, damit kommst Du bei 4 Millionen Bildpunkten auf fast 20MB Speicherbedarf für das Bild und etwas freien Speicher, um überhaupt noch arbeiten zu können, braucht Dein Skript auch. Entweder Du kannst das Memory-Limit zur Laufzeit verändern oder Du reduzierst die maximale Bildgröße oder Du buchst ein höherwertiges Paket ...

    Freundliche Grüße

    Vinzenz

  3. Hallo,

    eine Reihe nützlicher Hinweise hast du ja nun schon bekommen. Jetzt möchte ich dich noch auf ein gravierendes Missverständnis hinweisen.

    [...] der Fehler in der Zeile 64 (siehe Fehlermeldung oben!) läßt mich vermuten, dass der upload des 1. Bildes noch klappt, da in besagter Zeile 64 bereits das zweite Bild hochgeladen wird.

    Das ist falsch. Wenn dein PHP-Script überhaupt anfängt zu arbeiten, sind beide Bilder bereits hochgeladen worden.

    if($Bildinfos[2] == 1) $AltesBild=ImageCreateFromGIF($Fotoquelle);
    if($Bildinfos[2] == 2) $AltesBild=ImageCreateFromJPEG($Fotoquelle); // = Zeile 64 die oben moniert wird!

    Wenn sie es nicht wären, könntest du hier nicht mit einer PHP-Funktion auf das Bild zugreifen.
    Dein Problem ist tatsächlich, dass die gd-lib von PHP Bilder zum Bearbeiten unkomprimiert im Arbeitsspeicher hält, und das braucht einfach riesig viel Speicher.

    Ciao,
     Martin

    --
    Zwei Mäuse treiben's miteinander. Sagt der Mäuserich: "Hoffentlich ist nicht wieder alles für die Katz."