„Allowed memory size of … bytes exhausted“: PHP-Speicherfehler richtig beheben
PHP bricht mit „Allowed memory size of … bytes exhausted“ ab? So heben Sie memory_limit an – und so erkennen Sie, wann ein höheres Limit das eigentliche Problem nur versteckt.
Kurz gesagt: PHP erlaubt jedem Skriptaufruf nur eine bestimmte Menge Arbeitsspeicher, festgelegt im Wert memory_limit. Die Meldung „Allowed memory size of … bytes exhausted“ bedeutet: Ein Skript wollte mehr. Kurzfristig hilft es, das Limit in der php.ini, der .user.ini, der .htaccess oder bei WordPress mit WP_MEMORY_LIMIT anzuheben. Steckt aber eine Endlosschleife, eine riesige Datenbankabfrage oder ein zu großes Bild dahinter, verschiebt ein höheres Limit den Fehler nur.
Die vollständige Meldung sieht meist so aus:
Fatal error: Allowed memory size of 134217728 bytes exhausted
(tried to allocate 20480 bytes) in /var/www/html/includes/export.php on line 87
Bei WordPress sehen Sie stattdessen oft nur „Es gab einen kritischen Fehler auf dieser Website“. Die eigentliche Meldung steht dann in der debug.log oder im Fehlerprotokoll des Hosters.
Die Meldung richtig lesen
Die Zahl nach „Allowed memory size of“ ist das Limit in Bytes. Teilen Sie sie zweimal durch 1024, haben Sie Megabyte. Die häufigsten Werte:
67108864Bytes = 64 MB134217728Bytes = 128 MB268435456Bytes = 256 MB536870912Bytes = 512 MB
„Tried to allocate“ ist nur das letzte Stück Speicher, das PHP noch haben wollte. Ist diese Zahl klein (ein paar Kilobyte), hat sich der Speicher nach und nach gefüllt – typisch für Schleifen und große Datenmengen. Ist sie riesig (viele Megabyte), wollte PHP auf einen Schlag einen großen Block – typisch für Bilder oder das Einlesen ganzer Dateien.
Wichtig: Datei und Zeile in der Meldung zeigen, wo der Speicher ausging. Das ist nicht unbedingt die Stelle, die ihn verbraucht hat. Wie beim vollen Glas: Der letzte Tropfen ist nicht schuld am Überlaufen.
Die häufigsten Ursachen
Das Limit ist wirklich zu knapp
Ältere Hosting-Tarife oder Server-Konfigurationen stehen manchmal noch auf 32 oder 64 MB. Für ein modernes WordPress mit Page Builder oder einen Shop ist das wenig. Hier ist das Anheben die richtige Lösung.
Zu viele Daten auf einmal
Ein Skript lädt eine ganze Tabelle in ein Array: alle Bestellungen, alle Kunden, alle Logeinträge. Mit 2.000 Datensätzen ging das, mit 200.000 nicht mehr. In WordPress ist das klassische Beispiel eine Abfrage mit 'posts_per_page' => -1, die sämtliche Beiträge oder Produkte auf einmal holt. Auch Export-Funktionen bauen gern die komplette Datei im Speicher auf, bevor sie sie ausgeben.
Endlosschleife oder Endlosrekursion
Eine Funktion ruft sich selbst auf, ohne je aufzuhören, oder eine Schleife hängt immer wieder Daten an ein Array an. In WordPress passiert das gern mit Hooks: Eine Funktion an save_post ruft wp_update_post() auf, das wiederum save_post auslöst – und so weiter, bis der Speicher voll ist.
Große Bilder
Beim Verkleinern entpackt PHP ein Bild vollständig in den Arbeitsspeicher. Entscheidend sind dabei die Pixel, nicht die Dateigröße. Ein Foto mit 6000 × 4000 Pixeln braucht in GD grob gerechnet um die 100 MB – auch wenn die JPG-Datei nur 5 MB groß ist. Kommt das beim Upload vom Smartphone oder der Systemkamera, reichen 128 MB schnell nicht mehr.
Langsam wachsender Speicher
Lange laufende Skripte wie Importe oder Cronjobs sammeln Daten in Caches oder statischen Variablen, die nie geleert werden. Das fällt erst auf, wenn genug Datensätze durchlaufen.
So heben Sie memory_limit an
Prüfen Sie zuerst, welches Limit gerade gilt. In WordPress finden Sie es unter „Werkzeuge → Website-Zustand → Bericht → Server“. Ansonsten zeigt eine kleine Datei mit <?php phpinfo(); den Wert unter memory_limit. Löschen Sie diese Datei danach wieder, sie verrät viel über Ihren Server.
php.ini oder .user.ini
memory_limit = 256M
Auf eigenen Servern steht das in der php.ini. Auf Shared Hosting legen Sie es meist in einer .user.ini im Hauptverzeichnis ab. Diese wird nur gelesen, wenn PHP als FastCGI oder PHP-FPM läuft, und Änderungen greifen oft erst nach einigen Minuten. Viele Hoster bieten den Wert auch direkt im Kundenmenü an – das ist dann der einfachste Weg.
.htaccess
php_value memory_limit 256M
Vorsicht: Das funktioniert nur, wenn PHP als Apache-Modul läuft. Bei PHP-FPM oder FastCGI führt diese Zeile zu einem „500 Internal Server Error“. Läuft die Website nach der Änderung gar nicht mehr, entfernen Sie die Zeile sofort wieder.
WordPress: WP_MEMORY_LIMIT
define( 'WP_MEMORY_LIMIT', '256M' );
define( 'WP_MAX_MEMORY_LIMIT', '512M' );
Diese Zeilen gehören in die wp-config.php, oberhalb von require_once ABSPATH . 'wp-settings.php';. WP_MEMORY_LIMIT gilt für die Website, WP_MAX_MEMORY_LIMIT für speicherhungrige Aufgaben im Backend. WordPress setzt standardmäßig 40 MB (Multisite: 64 MB), hebt das Limit aber nur an, wenn PHP weniger erlaubt – es senkt es nie.
Alle drei Wege haben eine Grenze: Hat der Hoster ein Maximum festgelegt, bleibt jeder höhere Wert wirkungslos. Prüfen Sie nach der Änderung deshalb, ob der neue Wert wirklich angekommen ist.
Warum mehr Speicher oft nur das Problem versteckt
Ein höheres Limit ist schnell gesetzt. Deshalb ist es so verlockend. Aber fragen Sie sich: Warum braucht eine normale Seite plötzlich mehr als 128 MB?
- Bei einer Endlosschleife hilft kein Limit der Welt. Mit 512 MB dauert es nur länger, bis der Fehler kommt – und in der Zwischenzeit blockiert der Prozess den Server.
- Bei einer zu großen Abfrage wächst der Bedarf mit Ihren Daten. Heute reichen 256 MB, in einem Jahr mit doppelt so vielen Bestellungen nicht mehr. Der Fehler kommt wieder, nur später.
- Jeder Seitenaufruf, der 300 MB belegt, belegt diese 300 MB für jeden gleichzeitigen Besucher. Bei etwas mehr Andrang ist der Arbeitsspeicher des Servers voll, und die Website wird langsam oder fällt aus.
Ein Wert von memory_limit = -1 (unbegrenzt) gehört deshalb nie auf eine Live-Website. Dann bricht nicht mehr Ihr Skript ab, sondern im schlimmsten Fall der ganze Server.
Die Ursache finden
- Zeitpunkt eingrenzen: Tritt der Fehler auf jeder Seite auf oder nur bei einer Aktion – Upload, Export, Import, Checkout?
- Plugins prüfen: Bei WordPress Plugins nacheinander deaktivieren, idealerweise auf einer Kopie. Das Plugin „Query Monitor“ zeigt pro Seite den Speicherverbrauch und die Datenbankabfragen.
- Messen: In eigenem Code hilft eine einfache Ausgabe ins Fehlerprotokoll an verdächtigen Stellen:
error_log( 'Speicher: ' . round( memory_get_peak_usage( true ) / 1048576, 1 ) . ' MB' );
Steigt der Wert in einer Schleife mit jedem Durchlauf, haben Sie die Stelle gefunden.
Wie man es richtig löst
Große Datenmengen verarbeitet man in Portionen statt auf einmal:
$offset = 0;
do {
$rows = $pdo->query(
"SELECT id, email FROM kunden ORDER BY id LIMIT 500 OFFSET $offset"
)->fetchAll();
foreach ( $rows as $row ) {
verarbeite( $row );
}
$offset += 500;
} while ( count( $rows ) === 500 );
Exporte schreibt man Zeile für Zeile direkt in die Ausgabe oder eine Datei, statt sie erst komplett zusammenzubauen. Bei Hooks entfernt man den eigenen Hook vor dem Aufruf von wp_update_post() und hängt ihn danach wieder an. Und Bilder werden am besten schon vor dem Upload auf eine sinnvolle Größe gebracht.
Fehler, die Sie vermeiden sollten
- Das Limit immer weiter erhöhen, ohne nach der Ursache zu fragen.
php_valuein die.htaccessschreiben, ohne zu wissen, wie PHP beim Hoster läuft.- Den Wert an drei Stellen gleichzeitig setzen – dann weiß später niemand, welcher gilt.
- Die
phpinfo()-Datei auf dem Server vergessen.
Professionelle Hilfe
Wenn der Fehler trotz höherem Limit wiederkommt oder Sie nicht wissen, welches Plugin oder welcher Codeteil den Speicher frisst, suche ich die Stelle für Sie. Die PHP-Fehlerbehebung beginnt mit einer Analyse für 150 € netto, die Reparatur ab 290 € netto. Hoher Speicherverbrauch und langsame Ladezeiten haben oft dieselbe Ursache. Ist Ihre Website auch spürbar träge, lohnt sich ein Blick auf Website schneller machen ab 490 € netto.