Fatal Error: allowed memory size of bytes exhausted…
Wer diesen Fatal Error von PHP schon mal gesehen hat, der hat entweder 1. ein riesige Script geschrieben oder 2. einfach nur falsch programmiert
Nein jetzt mal im Ernst. Ich hatte den Fehler auch schon mehrmals und das aufgrund von Punkt 2. Ich würde auch sagen, dass es bei den meisten Fällen durch falsche Programmierung zu einer Speicherüberschreitung kommt.
Vorweg zum Verständnis: Der “Fatal Error: allowed memory size of XXX bytes exhausted” (meist mit einer bestimmten Byte-Anzahl statt der XXX
entsteht dann, wenn das ausgeführte PHP-Script mehr Speicher verlangt, als verfügbar ist. Ist das der Fall bricht PHP mit eben diesem Fatal Error ab. Das Speicher-Limit befindet sich in der php.ini des Servers und zwar als Variable
memory_limit = 16M ; Maximum amount of memory a script may consume (16MB)
Folgende Lösungen:
1. memory_limit erhöhen: entweder in der php.ini oder direkt in PHP mit dem Befehl:
ini_set('memory_limit', '32M');
2. Analyse des hohen Speicherverbrauchs mithilfe des Befehls memory_get_usage(), der den aktuellen Speicherplatzverbrauch des ausgeführten PHP-Scriptes ausgibt. Dabei kann man z. B. an verschiedenen Stellen im Quellcode den Speicherplatzverbrauch ausgeben und so die Stelle finden, wo sehr viel Speicherplatz benötigt wird. Das ist dann meist ein Programmierungsfehler.
Beispiel:
$mem['start'] = memory_get_usage(); echo $mem['start'].'Bytes verbraucht.'; ... PHP-Code... // Ausgabe des aktuellen Speicherverrbrauchs echo (memory_get_usage()-$mem['start']).'Bytes verbraucht.'; ... PHP-Code... <pre>// Ausgabe des aktuellen Speicherverrbrauchs</pre> echo (memory_get_usage()-$mem['start']).'Bytes verbraucht.';
Auf diese Weise lässt sich die mögliche “Fehlerquelle” für immensen Speicherplatzverbrauch analysieren. Lösung 1 ist keine richtige Lösung sondern hilft lediglich die Symptome zu beheben. Mit Lösung 2 lässt sich die Fehlerquelle relativ gut eingrenzen. Oft genügt es Variablen wieder mit unset() komplett freizugeben.
Beispiel:
//großes Array mit vielen Elementen $feld = array(...); //Ausgabe: 16000Byte verbraucht echo memory_get_usage().'Bytes verbraucht.'; //Array löschen unset($feld); //Ausgabe: 2000Byte verbraucht echo memory_get_usage().'Bytes verbraucht.';
- Geschrieben um 01:28Uhr
- RSS-Kommentare als Feed abonnieren
- TrackBack URI
Keine Kommentare
Einen Kommentar hinterlassen