Das PHP Memory Limit in WordPress – eine kurze Betrachtung

WordPress bläht sich mit jedem Plugin immer weiter auf. Fehlermeldungen wie

Fatal Error: Allowed memory size of xxxxxx bytes exhausted

sind die Folge. Wir kennen das. Aber eben auch, weil so mancher Billigheimer von Provider an den falschen Ecken spart. Das heisst, er spart aus seiner Sicht an der richtigen Stelle, nur die Kunden haben oft nicht ein Auge darauf, was entscheidend ist.
Und dann gibt es die vielen Tips, wie man den Arbeitsspeicher von PHP erhöhen kann.

Je nachdem, ob man einen eigenen Server oder ein shared Hosting Angebot nutzt, gibt es 3 Möglichkeiten, mehr Speicher für PHP loszueisen. Bei shared Hosting Angeboten kann es aber auch sein, dass diese oder jene Variante gar nicht vorgesehen ist oder nichts bewirkt. Einfach vom Mufti deaktiviert. Da hilft dann oft nur noch, ein klärendes Gespräch mit dem Provider oder diesen zu wechseln.

Den PHP Memory erhöhen

Die php.ini

Bei shared Hosting Paketen hat man eher selten die Chance, etwas in der php.ini Konfigurationsdatei zu ändern. Wenn man keinen Zugriff darauf hat, kann man zumindest versuchen, eine eigene Version zu erstellen und die in das Root-Verzeichnis seiner Webseite zu schieben. Dort schreibe man folgende Deklaration hinein:

memory_limit = 256M;

Dies setzt den für PHP Skripte verfügbaren Speicher auf 256 Megabyte (das „M“ in der Notation nicht vergessen) und zwar rekursiv für das Verzeichnis, in dem die php.ini liegt.

Die .htaccess

Gängigste Variante ist die Speicheraufstockung durch die .htaccess Datei, weil das gleich den gesamten PHP Speicher für alle Skripte (also nicht nur WordPress) beeinflusst. Das ist aber auch eine wahre Wundertüte, diese .htaccess:

php_value memory_limit 256M;

Dies setzt den für PHP Skripte verfügbaren Speicher wiederum auf 256 Megabyte (das „M“ in der Notation nicht vergessen) und zwar rekursiv für das Verzeichnis, in dem die .htaccess liegt.

Die wp-config.php

Kommt man weder an die .htaccess noch an die php.ini, so kann man sein Glück noch über die WordPress Konfigurationsdatei wp-config.php versuchen:

define('WP_MEMORY_LIMIT', '256M');

Wieder wird der für PHP verfügbare Speicher auf 256 Megabyte gesetzt, allerdings nur für WordPress eigene PHP Skripte.

Die meisten Tutorien hören an diesem Punkt auf. Ich habe allerdings den Verdacht, dass gerade die letzte Deklaration die entscheidende ist. Warum? Ich hatte in den letzten Tagen ein Problem mit dem Speicherüberlauf von WordPress, so dass ich ergründen musste, weshalb mir WordPress nach dem Veröffentlichen oder Aktualisieren eines Beitrages eine Fehlermeldung ausgab. Trotz eines Memory Wertes von 256 Megabyte!

Den Speicherbedarf und -verbrauch mit Plugins bestimmen

Viele Leute installieren sich dann das WP Memory Usage Plugin, was an sich auch eine gute Sache ist.
Ich habe aber ein Multisite fähiges Memory Plugin gesucht und bin bei diesem hier gelandet: WP Overview (lite) MS. Es existieren für diese Zwecke sicherlich noch andere gute Plugins, aber das macht erst einmal genau das, was ich haben will.
Es listet nämlich zum allgemeinen Server PHP Memory noch einen weiteren Wert auf: WP Memory.

WP Overview (lite) MS

das Plugin listet mehrere Memory Werte auf

Dieser Wert stand bei mir auf 64M. Diese 64 Megabyte hatte ich aber nirgendwo deklariert, im Gegenteil – ich hatte ja alles per .htaccess auf 256 Megabyte eingestellt (Der Screenshot wurde später mit anderen Werten gemacht)

Des Rätsels Lösung

WordPress bastelt sich den PHP Memory Wert folgendermaßen zusammen. In wp-settings.php werden durch den Funktionsaufruf mng_17_initial_constants(); Standardwerte für bestimmte Konstanten gesetzt. Die Funktion selbst findet man in wp-includes/default-constants.php, wo bei mir ein PHP Memory Limit von 64M voreingestellt wird:

function mng_17_initial_constants() {
	global $blog_id;

	// set memory limits
	if ( !defined('WP_MEMORY_LIMIT') ) {
		if( is_multisite() ) {
			define('WP_MEMORY_LIMIT', '64M');
		} else {
			define('WP_MEMORY_LIMIT', '40M');
		}
	}

	if ( ! defined( 'WP_MAX_MEMORY_LIMIT' ) ) {
		define( 'WP_MAX_MEMORY_LIMIT', '256M' );
	}

Weiter unten im Code erkennt man dann auch, dass dieser Wert solange verwendet wird, bis er von der entsprechenden Deklaration in wp-config.php überschrieben wird.
Aber liebe WordPress Entwickler … 64 Megabyte für eine Multisite und 40 Megabyte für eine Einzelinstallation? Wirklich?
Das frisst ja schon allein die deutsche Sprachversion auf :o)

Kann es nun sein, dass WordPress die Angaben in der .htaccess oder auch php.ini ignoriert und letztlich nur den Wert in der wp-config.php berücksichtigt? Als ich nämlich in der wp-config.php den PHP Speicher neu gesetzt habe, änderte sich auch der Wert in der WP Overview (lite) MS Anzeige. Auch die Probleme mit dem Speicherüberlauf verschwanden (teilweise).
Das heisst für mich, dass Einträge in der .htaccess und/oder php.ini schön und gut sind, aber ausschlaggebend die

define('WP_MEMORY_LIMIT', '256M');

Angabe in der wp-config.php ist?

Wenn ich mit dieser Vermutung falsch liege, so möge man mich bitte korrigieren. Am besten per Kommentar, damit es alle lesen können.

4 Kommentare:

  1. Hallo Lars,

    genau diese Info habe ich gesucht! Trotz Angabe von 2048M in der wp_config.php zeigte WP nur 512 MB an. Nach der Änderung in der default-constants.php habe ich nun die geforderten 2048 MB zur Verfügung, erogo wird (bei mir) die Angabe in der config.php nicht berücksichtigt.

    Gruß, Stan.

    • Das ist eine Änderung, die ich nicht empfehlen würde. Nach einem WP Update ist die Angabe in der default-constants.php wieder überschrieben.
      Wobei, welcher Hoster unterstützt denn ein Memory Limit von 2 GigaByte?

  2. Ok aber anders geht es ja nicht, der Wert in der config.php sowie in der php.ini wird ja nicht berücksichtigt. Hast du sonst noch eine idee?

    Ich betreibe meinen eigenen Server, da habe ich insgesamt 8GB zur Verfügung.

    • Berücksichtig wird letztlich der Wert aus der wp-config.php.
      Ich würde das also koppeln: einmal per .htaccess und zusätzlich per config-Datei.
      Das sollte eigentlich ausreichen und man muss keine Core-Files verändern.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.