unter.Strom.bz / 27 Beiträge / 11 Kommentare / blog feed / feed für kommentare

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.';

Keine Kommentare

Einen Kommentar hinterlassen