PHP-Speicherfehler beheben: 128 MB Limit & Optimierung

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

„Allowed Memory Size of 134217728 Bytes Exhausted“ – Die Notbremse Ihrer PHP-Anwendung

\n\n

Haben Sie diese Meldung schon einmal mitten in der Nacht gesehen, als Ihre Website plötzlich abstürzte und im Log nur eine weiße Schrift auf schwarzem Grund stand? Falls ja, sind Sie nicht allein. Tausende Entwickler auf Stack Overflow haben sich gefragt, warum ihr scheinbar harmloses PHP-Skript plötzlich ganze 128 Megabyte Arbeitsspeicher verschlingt und mit einem fatalen Fehler abstürzt.

\n\n

Lassen Sie uns klären, was dieser Fehler wirklich bedeutet, warum er auftritt und – vor allem – wie Sie ihn ein für alle Mal beheben. Wir werden nicht einfach nur das Speicherlimit erhöhen, sondern lernen, Code zu schreiben, der Ressourcen nicht wie ein hungriger Student in der Mensa verschwendet.

\n\n

Was bedeutet „134217728 Bytes Exhausted“?

\n\n

Die Zahl 134.217.728 entspricht 128 Megabyte. So viel Speicher darf Ihr Skript standardmäßig von PHP nutzen. Versucht das Skript, mehr Speicher anzufordern – zack! – erhalten Sie einen Fatal Error. Dies ist ein Schutzmechanismus, der verhindert, dass ein einzelnes Skript den gesamten Server lahmlegt.

\n\n

Die Krux daran: 128 MB sind für moderne Anwendungen oft sehr knapp bemessen. Die Verarbeitung großer XML-Dateien, das Generieren von Berichten aus einer Datenbank, die Arbeit mit Bildern oder schweren Bibliotheken – all das kann das Limit schnell überschreiten.

\n\n

Warum passiert das? Die drei Hauptursachen

\n\n
    \n
  • Speicherfressende Schleifen und Rekursion – wenn Sie alle Daten auf einmal in den Speicher laden, anstatt sie häppchenweise zu verarbeiten.
  • \n
  • Speicherlecks – statische Variablen, globale Arrays und die falsche Verwendung von static können Daten anhäufen.
  • \n
  • Schwere Bibliotheken und Erweiterungen – zum Beispiel die Bildverarbeitung mit GD oder die Arbeit mit PDF-Dateien.
  • \n
\n\n

So beheben Sie den Fehler: Vom Einfachen zum Komplexen

\n\n

Methode 1: Speicherlimit erhöhen (Schnelllösung)

\n\n

Der naheliegendste Weg ist, PHP einfach mehr Speicher zu geben. Aber denken Sie daran: Das ist keine Heilung, sondern ein Schmerzmittel. Wenn Ihr Code schlecht geschrieben ist, wird er auch 512 MB oder 1 GB auffressen.

\n\n

Es gibt drei Möglichkeiten, das Limit zu erhöhen:

\n\n

1. In der php.ini-Datei (dauerhafte Änderung):

\n
memory_limit = 256M
\n\n

2. In der .htaccess-Datei (falls verfügbar):

\n
php_value memory_limit 256M
\n\n

3. Direkt im Skript (nur für die aktuelle Ausführung):

\n
ini_set('memory_limit', '256M');
\n\n

Aber Vorsicht: Wenn Sie einen Shared-Hosting-Anbieter nutzen, erlaubt dieser möglicherweise keine Erhöhung über ein bestimmtes Limit hinaus. Und selbst wenn – übertreiben Sie es nicht.

\n\n

Methode 2: Code-Optimierung – Die eigentliche Lösung

\n\n

Anstatt dem Skript mehr Speicher zu geben, bringen wir ihm bei, mit dem Vorhandenen klug umzugehen.

\n\n

Nutzen Sie unset() zum Freigeben von Speicher

\n\n

PHP ist nicht C++, aber manuelle Speicherverwaltung funktioniert trotzdem. Wenn eine große Variable nicht mehr benötigt wird – löschen Sie sie:

\n\n
$data = file_get_contents('riesige_datei.csv');\n// Daten verarbeiten\nprocessData($data);\n// Speicher freigeben\nunset($data);\n
\n\n

Verarbeiten Sie Daten in Häppchen

\n\n

Laden Sie nicht 100.000 Zeilen aus der Datenbank auf einmal in den Speicher. Nutzen Sie stattdessen Cursors oder Limits:

\n\n
// SCHLECHT: Alles in den Speicher laden\n$users = $db->query(\"SELECT * FROM users\")->fetchAll();\n\n// GUT: Zeile für Zeile verarbeiten\n$stmt = $db->query(\"SELECT * FROM users\");\nwhile ($row = $stmt->fetch()) {\n    processUser($row);\n    // PHP gibt den Speicher nach jeder Iteration selbst frei\n}\n
\n\n

Nutzen Sie Generatoren (yield)

\n\n

Generatoren sind der Zauberstab für die Arbeit mit großen Datenmengen. Sie speichern nicht alle Werte im Speicher:

\n\n
function getLargeData() {\n    for ($i = 0; $i < 1000000; $i++) {\n        yield $i;\n    }\n}\n\nforeach (getLargeData() as $value) {\n    // Ein Element nach dem anderen verarbeiten\n    echo $value . \"\\n\";\n}\n

Blogs

Buchempfehlungen