Einleitung: Warum Ihr PHP-Skript «explodiert»?
\n\nHaben Sie schon einmal einen weißen Bildschirm mit der erschreckenden Meldung «Fatal Error: Allowed Memory Size of 134217728 Bytes Exhausted» gesehen? Falls ja, sind Sie nicht allein. Diese Frage auf Stack Overflow hat tausende Aufrufe gesammelt, und jeder zweite PHP-Entwickler ist ihr mindestens einmal im Leben begegnet.
\n\nDie Zahl 134217728 Bytes entspricht genau 128 Megabyte (dem Standardlimit vieler Hosting-Anbieter). Wenn Ihr Skript versucht, mehr zu belegen, sagt PHP «Stopp» und wirft einen fatalen Fehler. Aber keine Panik! In diesem Artikel analysieren wir, warum das passiert, wie man es behebt und – am wichtigsten – wie Sie die Leistung optimieren, damit der Speicherfehler Sie nicht mehr quält.
\n\nDer Artikel wurde für die Bildungswebsite PythonLib geschrieben, aber der gesamte Code und die Beispiele sind in PHP. Los geht's!
\n\nWas ist memory_limit und woher kommt «134217728»?
\n\nIn PHP gibt es die Direktive memory_limit, die den maximalen Speicher festlegt, der einem Skript zur Verfügung steht. Standardmäßig ist in vielen Konfigurationen (besonders auf Shared-Hosting) der Wert 128M (oder 134217728 Bytes) eingestellt.
Das aktuelle Limit können Sie so überprüfen:
\n\n<?php\necho ini_get('memory_limit'); // Gibt z.B. "128M" aus\n?>\n\nWenn Ihr Skript dieses Limit überschreitet, beendet PHP die Ausführung sofort mit einem fatalen Fehler. Die Ursachen können vielfältig sein: von suboptimalem Code bis zum Laden riesiger Dateien in den Speicher.
\n\nTypische Szenarien, die den Fehler auslösen
\n\n- \n
- Arbeit mit großen Arrays – z.B. das vollständige Einlesen einer CSV-Datei in den Speicher. \n
- Schleifen mit Speicherlecks – vergessen, Variablen freizugeben, oder Verwendung globaler Arrays. \n
- Bibliotheken zur Bildverarbeitung – GD oder Imagick bei der Arbeit mit hochauflösenden Fotos. \n
- Rekursive Funktionen – ohne Basisfall werden sie unendlich und fressen den Stack auf. \n
- ORM und Caching – manche ORMs (z.B. Doctrine) können die gesamte Tabelle in den Speicher laden. \n
So beheben Sie den Fehler: 3 bewährte Methoden
\n\n1. Temporäre Erhöhung des Limits mit ini_set()
\n\nDer schnellste Weg ist, das Limit direkt im Skript zu erhöhen:
\n\n<?php\nini_set('memory_limit', '256M');\n// Jetzt kann das Skript bis zu 256 MB verwenden\n?>\n\nWichtig: Dies funktioniert nur, wenn Ihr Hosting das Überschreiben der Direktive erlaubt. Bei manchen Hosting-Anbietern ist ini_set() für memory_limit gesperrt.
\n\n2. Änderung der php.ini oder .htaccess
\n\nWenn Sie Zugriff auf den Server haben, bearbeiten Sie die php.ini:
memory_limit = 256M\n\nOder über die .htaccess (bei Apache):
php_value memory_limit 256M\n\nStarten Sie nach den Änderungen den Webserver oder PHP-FPM neu.
\n\n3. Code-Optimierung – die beste Methode
\n\nDas Limit zu erhöhen ist eine Krücke. Die wahre Lösung ist, effizienten Code zu schreiben. Schauen wir uns Beispiele an.
\n\nPraktisches Beispiel: Verarbeitung einer großen CSV-Datei
\n\nAngenommen, Sie haben eine CSV-Datei mit 500.000 Zeilen. Naiver Code könnte so aussehen:
\n\n<?php\n$rows = file('data.csv'); // Lädt die GESAMTE Datei in den Speicher!\nforeach ($rows as $row) {\n // Verarbeitung\n}\n?>\n\nBei einer Dateigröße von 200 MB wird das Skript mit einem Speicherfehler abstürzen.
\n\nOptimierung: Zeilenweises Lesen
\n\n<?php\n$handle = fopen('data.csv', 'r');\nif ($handle) {\n while (($row = fgetcsv($handle)) !== false) {\n // Verarbeitet eine Zeile nach der anderen\n // Der Speicher wächst kaum\n }\n fclose($handle);\n}\n?>\n\nJetzt verbraucht das Skript nur wenige Megabyte, unabhängig von der Dateigröße.
\n\n<