Jan: Bilderstellung: Fatal error: Allowed memory size

Hi,

"Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 13274305 bytes)..."

Dieser Fehler sagt das es dem Nutzer nicht erlaubt ist PHP/GD in dieser
Grössenordnung zu gebrauchen.

Nur sieht diese Meldung natürlich hässlich aus. Kann ich das irgendwie abfangen und am Besten vorher prüfen inwieweit der Server beansprucht wird.

So könnte ich eine schönere Fehlermeldung anzeigen lassen.

Grüsse
Jan

  1. Dieser Fehler sagt das es dem Nutzer nicht erlaubt ist PHP/GD in dieser
    Grössenordnung zu gebrauchen.

    Nur sieht diese Meldung natürlich hässlich aus. Kann ich das irgendwie abfangen und am Besten vorher prüfen inwieweit der Server beansprucht wird.

    Diese Fehlermeldungen seitens PHP sollten auf ordentlich eingerichteten Servern gar nicht in den Webseiten zu sehen sein, sondern ausschließlich im Fehlerprotokoll des Servers landen.
    Die zuständige Einstellung ist display_errors.

    Es ist auch nicht so, dass das die Fehlermeldung für das Skript wäre, die du nun irgendwie abfangen oder ändern können müsstest. Die meldende Funktion sollte vielmehr einen Rückgabewert liefern, der den Fehler auch für dein Programm anzeigt.

    1. Hello,

      Diese Fehlermeldungen seitens PHP sollten auf ordentlich eingerichteten Servern gar nicht in den Webseiten zu sehen sein, sondern ausschließlich im Fehlerprotokoll des Servers landen.
      Die zuständige Einstellung ist display_errors.

      Und wie würdest Du jetzt diesen Fehler abfangen?
      Wenn Out-of-Memory eintritt, lässt PHP mWn auch leider keine Weiterarbeit mehr zu.

      Dass man das mit OOP und Try/Catch abfangen kann, wage ich auch zu bezweifeln, gebe aber zu, dass ich es noch nicht ausprobiert habe.

      Ich hätte mir gewünscht, dass PHP für diese Fälle (Abbruch des Scriptes) zumindest eine hart codierte Ersatzseite zulassen würde. Das müsste man doch eigentlich relativ einfach einbauen können in das Runtime.

      Liebe Grüße

      Tom vom Berg

      --
      Nur selber lernen macht schlau
      1. echo $begrüßung;

        Wenn Out-of-Memory eintritt, lässt PHP mWn auch leider keine Weiterarbeit mehr zu.

        Wenn der Speicher verbraucht ist, dann ist da auch nichts mehr übrig, um eine Fehlerbehandlungsroutine zu starten, die ja auch wieder Speicher benötigt.

        Dass man das mit OOP und Try/Catch abfangen kann, wage ich auch zu bezweifeln, gebe aber zu, dass ich es noch nicht ausprobiert habe.

        try-catch ist nur für Exceptions. PHP selbst wirft keine Exceptions (von einigen wenigen neueren Extensions abgesehen).

        echo "$verabschiedung $name";

        1. Hello,

          Wenn Out-of-Memory eintritt, lässt PHP mWn auch leider keine Weiterarbeit mehr zu.

          Wenn der Speicher verbraucht ist, dann ist da auch nichts mehr übrig, um eine Fehlerbehandlungsroutine zu starten, die ja auch wieder Speicher benötigt.

          Das mag für einfache Compiler-Sprachen zutreffend sein, aber nicht für Interpreter-Sprachen, deren Runtime ja schließlich noch über eigenen Speicher verfügt.

          Liebe Grüße

          Tom vom Berg

          --
          Nur selber lernen macht schlau
          1. echo $begrüßung;

            Wenn der Speicher verbraucht ist, dann ist da auch nichts mehr übrig, um eine Fehlerbehandlungsroutine zu starten, die ja auch wieder Speicher benötigt.
            Das mag für einfache Compiler-Sprachen zutreffend sein, aber nicht für Interpreter-Sprachen, deren Runtime ja schließlich noch über eigenen Speicher verfügt.

            Kann sein, PHP jedenfalls deklariert es als fatal und unlösbar, und diese Art von Fehler führt zum sofortigen Abbruch.

            echo "$verabschiedung $name";

            1. Hello,

              Kann sein, PHP jedenfalls deklariert es als fatal und unlösbar, und diese Art von Fehler führt zum sofortigen Abbruch.

              Naja, das ist eben das Problem.
              Die PHP-Entwickler sind hier bestimmt noch gar nicht auf die Idee gebracht worden, das sie ohne großen  Aufwand eine Verbesserung einbauen könnten und mit etwas Aufwand sogar eine erhebliche Verbesserung schaffen könnten.

              Das Error-Handling ist noch nicht zuende entwickelt.

              Liebe Grüße

              Tom vom Berg

              --
              Nur selber lernen macht schlau
  2. Hallo Jan,

    "Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 13274305 bytes)..."

    Dieser Fehler sagt das es dem Nutzer nicht erlaubt ist PHP/GD in dieser
    Grössenordnung zu gebrauchen.

    Nur sieht diese Meldung natürlich hässlich aus. Kann ich das irgendwie abfangen und am Besten vorher prüfen inwieweit der Server beansprucht wird.

    nur zum Teil und nicht in jedem Fall, siehe meine Beiträge in folgendem  Archivthread und die darin enthaltenen weiterführenden Links.

    Freundliche Grüße

    Vinzenz

    1. Hello Jan,

      "Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 13274305 bytes)..."

      Da gab es einen etwas längeren Thread http://forum.de.selfhtml.org/archiv/2007/12/t163004/#m1061781

      Der hat dann in Folge zu dieser Funktion geführt, die gewiss noch nicht wirklich sicher ist.
      $_imageinfo ist das Ergebnis der Funktion getimagesize()
      Die Konstante MEMORY_LEFT sollte nicht unter 100000 liegen. Sie kennzeichnet den Speicher, der noch für weitere Operationen übrig bleiben muss.

      function image_check_memory($_imageinfo, $memleft = MEMORY_LEFT)  ## X, Y, bits, channels
      {
         ## fehlende Angaben durch Raten ergänzen
         if (!isset($_imageinfo['bits'])) $_imageinfo['bits'] = 8;
         if (!isset($_imageinfo['channels']) and $_imageinfo['bits'] == 24) $_imageinfo['channels'] = 1;
         if (!isset($_imageinfo['channels'])) $_imageinfo['channels'] = 3;

      $memoryNeeded = round(($_imageinfo[0] * $_imageinfo[1] * $_imageinfo['bits'] * $_imageinfo['channels'] / 8 + 65536) * 1.65);
         $memoryLimit = intval(ini_get('memory_limit')) * 1048576;

      if ((memory_get_usage() + $memoryNeeded) + $memleft > $memoryLimit)
         {
           error_log('IMAGE_MEMORY usage: '.memory_get_usage().", needed: $memoryNeeded, limit: $memoryLimit\n", 3, '/var/log/web04/php_error_log');
           return false;
         }

      return true;
      }

      Die Funktion verhindert (meistens) das Überschreiten des Speicherbedarfs durch Bilderoperationen.

      Die im thread mit Engin und mir genannten Links auf meinen Server sind zur Zeit leider außer Betrieb, aber vielleicht bekomme ich es an diesem Wochenende geregelt, dass sie wieder "funxen" ;-)

      Liebe Grüße

      Tom vom Berg

      --
      Nur selber lernen macht schlau