Fatal error: Allowed memory size of ... übliche Fehler ausgeschlossen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Fatal error: Allowed memory size of ... übliche Fehler ausgeschlossen

    Hallo Forum,

    ich habe folgende Fehlermeldung lokal:

    PHP-Code:
    Fatal errorAllowed memory size of 33554432 bytes exhausted (tried to allocate 12096 bytesin C:\.... 
    Dabei geht es um einen Bildupload. Die relevante Zeile:

    PHP-Code:
     $new_picture_kl  imagecreatetruecolor($breite_neu$hoehe_neu); 
    Nach einigem Suchen und Googlen und rumtesten habe ich folgendes getan, um zu debuggen:

    -in der .ini den erlaubten Speicher auf zuerst 32M erhöht, dann auf 40M
    -Schleifen überprüft - es gibt weder FOR noch WHILE noch sonstige Schleifen, die irgendwas endloses produzieren könnten im Quelltext
    -das Bild, das ich hochlade ist ein RGB-JPG mit 960KB (ein kleineres mit 150 KB funktioniert) Selbst wenn ich die Pixelmaße ausrechne, komme ich nur auf 17MB, die das Bild belegen sollte...
    -Der Clou: Auf zwei verschiedenen Servern bei zwei unterschiedlichen Anbietern funktioniert es problemlos. Die PHPInfo für den einen Server sagt mir ein Limit von 40M. Auch diese 40MB funktionieren nicht lokal.
    -Ich verwende hier Windows (3 Gig RAM) und XAMPP

    Es muß also irgendwie an den Einstellungen auf meinem Rechner, bzw. XAMPP, PHPini liegen, oder?

    Hat jemand einen Tipp?

    Danke schonmal und Grüße,
    Pust

    EDIT:
    Ach ja, um es gleich vorweg zu nehmen: Ich habe zum Testen das Script auf ein Minimum reduziert, es ist nur noch das upload-Form drin und die Bildoperationen sonst nichts.

  • #2
    OffTopic:
    Wer hätte gedacht hier nochmal einen so vorbidlich vorbereiteten Post zu sehen


    Weiter helfen kann ich dir aber leider nicht.

    Kommentar


    • #3
      Allowed memory size of 33554432 bytes exhausted
      Das sind aber noch keine 40 MB. Webserver neu gestartet? Richtige INI-Datei?

      Kommentar


      • #4
        Du redest über 2 Bilder!
        2*17 ist?

        Breite Höhe und Anzahl der Bilder wäre interessant zu wissen.
        Wir werden alle sterben

        Kommentar


        • #5
          AAaaaalso:

          Das sind aber noch keine 40 MB. Webserver neu gestartet? Richtige INI-Datei?
          Das war noch die Fehlermeldung, bevor ich auf den Server geschaut hatte, was angegeben war und ich es dann entsprechend abgeändert habe. Aber selbst 32 sollten ja dicke reichen...

          Du redest über 2 Bilder! 2*17 ist? Breite Höhe und Anzahl der Bilder wäre interessant zu wissen.
          Immer nur ein Bild im Script. Also 2 Versuche. Nacheinander hochgeladen halt:

          Bild 1: JPG, RGB 60.137 Bytes, 600x900px. Pixelmaße *3 (RGB) = 1,54MB

          Geht problemlos. Auch nach dem fehlgeschlagenen Hochladen des anderen Bildes noch.

          Bild 2: JPG, RGB 1.043.029 Bytes, 3024 x 1899 px. Pixelmaße: 16,4MB

          Kommentar


          • #6
            Nein!
            Du abeitest jeweils mit 2 Bildern!!
            1. das hochgeladene
            2. das per imagecreatetruecolor() erzeugte

            Auch ist deine Formel zu optimistisch!
            Bytes = x*y*5+y*30
            Ist deutlich näher dran.
            Zuletzt geändert von combie; 09.01.2009, 15:09.
            Wir werden alle sterben

            Kommentar


            • #7
              Combie Du hast sicher recht. Ich hab mal auf 50, dann auf 60, dann auf 100 MB erhöht. Bei 100 geht es dann.

              Nur: Warum funzt es dann auf dem Server mit den 40M ? Erlaubt der mehr, als er anzeigt?

              Kannst Du mir die Formel näher erläutern?

              x*y*5+y*30


              Danke und Grüße,
              Pust

              Kommentar


              • #8
                Original geschrieben von Pust

                Kannst Du mir die Formel näher erläutern?
                x*y*5+y*30
                Nicht wirklich. Aber hier habe ich mal was dazu geschrieben:
                http://phpforum.de/forum/showthread.php?t=222506

                Und einen Fetzen Testcode kann ich dir auch geben:
                (und wie man sieht, liegt meine Formel auch nicht besonders gut in Spur)
                PHP-Code:
                <?php
                error_reporting
                (E_ALL|E_STRICT); 
                ini_set('display_errors'TRUE); 

                function 
                real($x,$y)
                {
                  
                $start memory_get_usage();
                  
                $im imagecreatetruecolor($x,$y); // bild erzeugen
                  
                $end memory_get_usage();
                  
                imagedestroy($im); // zerstören
                  
                return $end $start;
                }

                function 
                formel($x,$y)
                {
                    return 
                $x*$y*5+$y*30;
                 
                //   return 8192 + $x*$y*5+$y*24;
                }

                function 
                ausgabe($x,$y)
                {
                  
                $abweichung formel($x,$y) - real($x,$y);
                  echo 
                "X: $x   Y: $y   Abweichung: $abweichung <br>";
                }


                ///----------------



                $maxx 1000;
                $maxy 1000;
                $step 100;


                // einen zum warmlaufen
                real($maxx,$maxy);


                for(
                $x=$step;$x<=$maxx;$x+=$step)
                  for(
                $y=0;$y<=$maxy;ausgabe($x,$y+=$step));


                ?>
                Zuletzt geändert von combie; 09.01.2009, 15:59.
                Wir werden alle sterben

                Kommentar


                • #9
                  Nur mal so als Ergänzung: Es gibt eine Methode, um den Speicherplatzbedarft genau herauszubekommen (berechnen kann man das nicht nennen). Wenn man das Bild irgendwie in eine Image-Resource bekommen hat, kann man es im "gd-Format" speichern. Die Dateigröße sollte der Größe des belegten Speichers ziemlich nahe kommen.

                  @OP:

                  -Schleifen überprüft - es gibt weder FOR noch WHILE noch sonstige Schleifen, die irgendwas endloses produzieren könnten im Quelltext
                  Ohne Blick in den Quelltext kann man da nur Vermutungen anstellen. Grundsätzlich sind Schleifen nicht speicherfressender als andere Programmablaufkonstrukte.

                  (...)
                  -Der Clou: Auf zwei verschiedenen Servern bei zwei unterschiedlichen Anbietern funktioniert es problemlos. Die PHPInfo für den einen Server sagt mir ein Limit von 40M. Auch diese 40MB funktionieren nicht lokal.
                  Was den Verdacht nährt, dass auf dem System, wo es nicht funktioniert, noch etwas Zusätzliches ausgeführt, eingebunden oder wie auch immer in den Speicher geladen wird.
                  -Ich verwende hier Windows (3 Gig RAM) und XAMPP
                  Für moderne Windows-Versionen gibts den Proces************plorer von Sysinternals/M$FT, der stellt nicht nur die laufenden Prozesse übersichtlich dar, sondern gibt auch Auskunft über den wirklichen Speicherverbrauch. Wenn PHP als Servermodul läuft, findest du den passenden Prozess unter "Apache.exe" oder "httpd.exe".
                  Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

                  Kommentar


                  • #10
                    Danke an alle erstmal. Bei Gelegenheit schau ich mir den Speicherverbrauch noch näher an. Vorerst nehme ich einfach mal in Kauf, daß es eben etwas mehr braucht, als nur einfach h*b*rgb.

                    Das mit den Schleifen hab ich nicht geschrieben, weil ich denke, daß die besonders viel Speicher brauchen, sondern nur um klar zu machen, daß ich nicht irgendwas aus Versehen mit einer Endlosschleife zugemüllt habe. Die Speicherfresser liegen ja meist zwischen { und } ;-)

                    Kommentar


                    • #11
                      Hey Combie, hab mir gerade mal Deinen Link durchgeschaut.

                      Das Fazit scheint zu sein, daß kein Mensch wirklich weiß, wie Größe bei der Dateioperation wirklich zustande kommt, oder?

                      Kann man da niemanden Fragen? Irgendein Institut oder sowas wird das doch wohl mal gebaut/erfunden/programmiert/entwickelt haben?

                      Naja, um ehrlich zu sein, so wichtig ist es mir dann auch wieder nicht, hauptsache das Script funzt!

                      Kommentar

                      Lädt...
                      X