Fehlermeldung „Allowed memory size exhausted“: Erhöhung der PHP-Speichergrenze

WordPress 6 Min. Lesezeit

Der schwerwiegende Fehler „Allowed memory size of 268435456 bytes exhausted“ wird von PHP ausgegeben, wenn eine einzelne Anfrage mehr Speicher anfordert, als die Einstellung „memory_limit“ zulässt. Die Anfrage wird sofort abgebrochen: Der Besucher sieht eine leere Seite oder die Meldung „Auf unserer Website ist ein schwerwiegender Fehler aufgetreten“, und ein Upload oder eine Aktualisierung wird unterbrochen.

Die Lösung umfasst zwei Schritte: Erhöhen Sie das Limit auf das für Ihre Website geltende Niveau und prüfen Sie, ob der Fehler möglicherweise durch ein außer Kontrolle geratenes Plugin oder eine Bildbearbeitung verursacht wird. Im letzteren Fall verzögert das höhere Limit lediglich den nächsten Ausfall.

Was besagt die Fehlermeldung?

PHP Fatal error:  Allowed memory size of 268435456 bytes exhausted (tried to allocate 20480 bytes) in /home/felhasznalonev/public_html/wp-includes/class-wp-image-editor-gd.php on line 118
  • Allowed memory size of 268435456 bytes – das Limit in Bytes. Um in MB umzurechnen, dividieren Sie den Wert durch 1 048 576: 134217728 = 128 MB, 268435456 = 256 MB, 536870912 = 512 MB.
  • „tried to allocate 20480 bytes“: Dies bezieht sich auf die eine Zuweisung, die nicht mehr untergebracht werden konnte, nicht auf den gesamten Bedarf der Anfrage. Wenn dieser Wert gering ist, hat die Anfrage bereits die Obergrenze erreicht.
  • in … on line …: Der Code, der den Speicher angefordert hat. Wenn er auf den Ordner eines Plugins verweist (wp-content/plugins/<név>/), ist dieses der Verdächtige. Wenn er auf den WordPress-Kern (wp-includes) verweist, handelt es sich lediglich um den Ausführer; die eigentliche Ursache zeigen wir weiter unten auf und erklären, wie Sie diese finden können.

Auf den cPanel-Servern von aWh schreibt PHP Fehler in die Datei „logs/php.error.log“ im Home-Verzeichnis:

grep -h "Allowed memory size" ~/logs/php.error.log ~/public_html/error_log 2>/dev/null | tail -n 3

Drei Grenzen, ineinander verschachtelt

Infografik: Der physische Arbeitsspeicher von CloudLinux, der PHP-Parameter memory_limit und der WordPress-Parameter WP_MEMORY_LIMIT in ihrer Wechselbeziehung

  1. Der physische Speicher des Kontos (CloudLinux PMEM). Er ist Bestandteil des cPanel-Hosting-Pakets und gilt für alle Prozesse des Kontos: für alle gleichzeitig ausgeführten PHP-Anfragen, für Cron-Aufgaben sowie für SSH. Die Werte sind im Artikel über die Ressourcenbeschränkungen der Pakete aufgeführt.
  2. Das PHP-memory_limit – die Obergrenze für eine einzelne PHP-Anfrage. Diese Einstellung kann in cPanel auf der Seite „Select PHP Version“ vorgenommen werden.
  3. Die WordPress-Konstanten „WP_MEMORY_LIMIT“ und „WP_MAX_MEMORY_LIMIT“ befinden sich in der Datei „wp-config.php“. WordPress kann damit lediglich die PHP-Grenze erhöhen, nicht jedoch verringern, und darf die PHP-Einstellung „memory_limit“ nicht überschreiten. Sind diese Werte nicht festgelegt, beträgt der Standardwert für Besucherseiten 40 MB und für den Admin-Bereich sowie die Bildbearbeitung 256 MB; ist die PHP-Grenze jedoch höher, gilt der höhere Wert.

Von diesen drei Ursachen wird der Fehler „Allowed memory size“ stets durch den Parameter „memory_limit“ verursacht. Wenn der physische Arbeitsspeicher des Kontos voll ist, treten andere Symptome auf (siehe unten), und in diesem Fall verschlimmert eine Erhöhung des „memory_limit“-Werts die Situation.

1. Überprüfen Sie das geltende Limit

Am einfachsten geht dies über die Admin-Oberfläche: „Tools“ › „Website-Zustand“ › „Informationen“ – im Abschnitt „Server“ finden Sie die Zeile „PHP-Speicherlimit“. Die Werte für „WP_MEMORY_LIMIT“ und „WP_MAX_MEMORY_LIMIT“ werden dort im Abschnitt „WordPress-Konstanten“ angezeigt.

Die Befehlszeile ist hier keine Hilfe, da das Befehlszeilen-PHP auf den aWh-Servern keine Speicherbegrenzung hat (der Wert von „wp eval 'echo ini_get("memory_limit");'“ lautet -1, d. h. unbegrenzt). Sie können den Web-Wert über eine temporäre Datei abfragen, die Sie anschließend sofort löschen:

echo '<?php echo ini_get("memory_limit"), PHP_EOL;' > ~/public_html/memteszt-7f3k.php
curl -s https://pelda.hu/memteszt-7f3k.php
rm ~/public_html/memteszt-7f3k.php

2. Erhöhen Sie den Wert von „memory_limit“

  1. Melden Sie sich bei cPanel an und klicken Sie in der Gruppe „Software“ auf das Symbol „Select PHP Version“.
  2. Klicken Sie auf die Registerkarte „Einstellungen“.
  3. Wählen Sie in der Zeile „memory_limit“ einen höheren Wert aus der Liste aus. Die Änderung wird automatisch gespeichert und gilt ab der nächsten Anfrage.

PHP-Version auswählen, Registerkarte „Einstellungen“: die PHP-Optionen, darunter „memory_limit“

Die Einstellung gilt für alle Websites Ihres Kontos, die die jeweilige PHP-Version verwenden. Ausführlichere Informationen finden Sie im Artikel zur Verwaltung von PHP-Erweiterungen und -Einstellungen. Für einen einzelnen Ordner können Sie mit der Datei „.user.ini“ einen abweichenden Wert festlegen (Verwendung der Datei „.user.ini“); PHP speichert diese Datei maximal 5 Minuten lang im Cache, daher kann es zu einer Verzögerung bei der Übernahme der Änderung kommen.

Sie können den Wert auch in einer Ordner-.htaccess-Datei mit der Zeile „php_value memory_limit 256M“ festlegen; dies funktioniert ebenfalls auf unseren Servern. Bewahren Sie die Einstellung an einer einzigen Stelle auf, denn wenn „Select PHP Version“, die .user.ini-Datei und die .htaccess-Datei unterschiedliche Angaben enthalten, ist es schwierig herauszufinden, welche davon gültig ist.

Sofern die PHP-Obergrenze hoch genug ist, sind die WordPress-Konstanten in der Regel nicht erforderlich. Sollten sie von einem Plugin ausdrücklich angefordert werden oder sollte die Seite „Website-Zustand“ einen niedrigen Wert anzeigen, richten Sie sie bitte wie folgt ein:

cd ~/public_html
wp config set WP_MEMORY_LIMIT 256M
wp config set WP_MAX_MEMORY_LIMIT 512M

Bei manueller Bearbeitung müssen die beiden „define()“-Zeilen über dem Kommentar „/* That's all, stop editing! */“ stehen. Sollte sich nach der Anpassung nichts ändern, ist der PHP-Wert „memory_limit“ zu niedrig oder wird er später von einer PHP-Erweiterung überschrieben: „grep -rn "memory_limit" ~/public_html/wp-content --include=*.php“.

4. Ist die Begrenzung tatsächlich das Problem?

Eine durchschnittliche WordPress-Seite läuft bereits mit einigen zehn MB Arbeitsspeicher. Wenn selbst 512 MB für eine Anfrage nicht ausreichen, funktioniert etwas nicht richtig, und die höhere Obergrenze verschafft Ihnen lediglich Aufschub bis zum nächsten Fehler. So suchen Sie nach der Ursache:

  • Der Pfad der Fehlermeldung. Wenn dieser auf den Ordner eines Plugins verweist, ist dieses der Verdächtige. Wenn er auf den WordPress-Kern verweist, installieren Sie das Plugin „Query Monitor“, das den Spitzen-Speicherverbrauch pro Abfrage anzeigt, und rufen Sie die fehlerhafte Seite auf.
  • Ausschlussverfahren. Speichern Sie die Liste der aktiven Plugins, deaktivieren Sie alle, reproduzieren Sie den Fehler und aktivieren Sie die Plugins dann gruppenweise wieder, bis der Fehler erneut auftritt (es empfiehlt sich, dies auf einer Staging-Kopie durchzuführen):
wp plugin list --status=active --field=name > ~/aktiv-bovitmenyek.txt
wp plugin deactivate --all
# ... a hiba ellenőrzése, majd a visszakapcsolás:
wp plugin activate $(cat ~/aktiv-bovitmenyek.txt)
  • Bildverarbeitung. Wenn der Fehler in der Datei „class-wp-image-editor-gd.php“ auftritt, wird der Arbeitsspeicher durch die Größenanpassung eines großen Fotos beansprucht. GD speichert das entpackte Bild mit etwa 4 Byte pro Pixel im Arbeitsspeicher, sodass ein Foto mit 24 Megapixeln bereits vor der Erstellung von Miniaturansichten ca. 100 MB groß ist. Verringern Sie die Größe der Bilder vor dem Hochladen oder generieren Sie die Miniaturansichten der vorhandenen Bilder erneut über die Befehlszeile, wo keine Speicherbeschränkung besteht: wp media regenerate --yes. Auf der Oberfläche „Select PHP Version“ können Sie auch das imagick-Plugin aktivieren; WordPress wählt dieses dann anstelle von GD aus.
  • Massenvorgänge. Ein Produktimport oder der Export einer großen Bestellung sollte nicht im Browser ausgeführt werden. Führen Sie diese Vorgänge mit WP-CLI oder im Hintergrundmodus des Plugins aus, damit Sie nicht für jede Webanfrage eine hohe Obergrenze festlegen müssen.

Wenn der Fehler nicht bei der „Allowed memory size“ liegt

Wenn im Protokoll „Out of memory“ angezeigt wird oder der Besucher einen 503-Fehler bzw. die Seite „508 Resource Limit Is Reached“ erhält, hat nicht eine einzelne Anfrage, sondern das gesamte Konto die physische Speichergrenze des Pakets oder die Grenze für gleichzeitige Prozesse erreicht. In diesem Fall verschlimmert eine Erhöhung des memory_limit die Situation, da jede Anfrage einen größeren Anteil des gemeinsamen Kontingents beanspruchen kann. Sehen Sie sich in der cPanel-Gruppe „Metriken“ die Seite „Ressourcenverbrauch“ (Fehlerzähler) an, ermitteln Sie, was das Konto belastet, und wechseln Sie zu einem größeren Paket, falls die Website einfach aus dem aktuellen Paket herausgewachsen ist. Zum Fehler 508 gibt es einen separaten Artikel.

Falls die Website eine leere Seite anzeigt, in keinem der Protokolle jedoch ein Speicherfehler vermerkt ist, bietet der Artikel zum Thema „Weißer Bildschirm“ Hilfe.

Zurück: WordPress-Artikel (43)