WordPress Plugin NextGEN Gallery „Exceed Memory limit“ gelöst

Als ich den Beitrag zu Picture My Day erstellte, hatte ich Schwierigkeiten mit dem NextGEN Gallery Plugin. Beim Upload bzw. Einlesen der Bilder in der neuen Galerie sollten automatisch Vorschaubilder (Thumbnails) erzeugt werden. Allerdings schlug dieser Vorgang mit der folgenden Fehlermeldung fehl:

Error : Exceed Memory limit. Require : 78.31 MByte

Das ganze hat mich zunächst einmal ziemlich verblüfft, da ich das Anlegen einer neuen Galerie schon vielfach durchgeführt habe und nie Schwierigkeiten damit hatte. Eine schnelle Problemlösung schien nicht in Sicht, weshalb ich die Thumbnails extern auf meinem PC erstellt habe. Nun hatte ich Zeit, um das Problem näher zu untersuchen.

Zunächt sei gesagt, dass ihr im WordPress Dashboard in der linken Menüleiste auf „Galerie“ -> „Übersicht“ klicken könnt, um euch auf der rechten Seite eure „Server-Einstellungen“ anzusehen. Interessante Werte:

Speicherverbrauch : 57.87 MByte
PHP Memory Limit : 64

Die Angabe Speicherverbrauch bezieht sich, wenn ich das korrekt interpretiere, auf den von WordPress inkl. der aktiven Plugins genutzten Arbeitsspeicher. Unter welchen Bedingungen auch immer. So ganz klar ist mir das nicht, allerdings erscheint mir der Wert schon sehr hoch. Klar treiben Plugins den Wert nach oben, aber ich bin nicht jemand, der aus Spaß Plugins installiert. Werde aber in Zukunft Recherchen anstellen, ob ich den Verbrauch senken kann. Das PHP Memory Limit steht auf 64MByte. Das ist leider auch der Höchstwert für mein Webhosting Paket. Falls ihr dort noch Luft habt, gibt es Mittel und Wege, um WordPress bzw. den Plugins mehr Speicher zu erlauben. Z.B. diesen Tipp oder einfach mal googeln!

GD Library

Was generiert die Thumbnails eigentlich und wie berechnet sich der Speicherbedarf für ein Bild?

Dabei bin ich auf einen sehr guten Beitrag des Entwicklers der NextGEN Gallery gestoßen: http://alexrabe.de/2008/05/13/understand-gd-library/

Kurz gesagt, eine Bibliothek namens „GD“ ist für die Bildmanipulationen zuständig. Diese verbraucht natürlich Arbeitsspeicher, während sie ein Bild verarbeitet. Wichtig ist, dass die Dateigröße keineswegs mit dem benötigten Speicher während der Verarbeitung übereinstimmt! Eine Annäherung wird auch genannt:

$
\frac{Width * Height * 8 Bits * 3 Channels}{8 * 1.65}
$

PHP Code des Plugins

Unter wp-content/plugins/nextgen-gallery/lib findet sich die Datei gd.thumbnail.inc.php, aus welcher ich hier Code zitiere.

if($this->error == false) {
// Check memory consumption if file exists
$this->checkMemoryForImage($this->fileName);
}

Dieser Aufruf prüft vor der Generierung des Thumbnails, ob genügend Speicher für die Operation zur Verfügung steht.

Springen wir in die Funktion:

function checkMemoryForImage( $filename ){

...

$K64 = 65536;    // number of bytes in 64K
$TWEAKFACTOR = 1.68;  // Or whatever works for you
$memoryNeeded = round( ( $imageInfo[0] * $imageInfo[1] * $imageInfo['bits'] * $CHANNEL / 8 + $K64 ) * $TWEAKFACTOR);
$memoryNeeded = memory_get_usage() + $memoryNeeded;
// get memory limit
$memory_limit = ini_get('memory_limit');

...

if ($memoryNeeded > $memory_limit) {
$memoryNeeded = round ($memoryNeeded / 1024 / 1024, 2);
$this->errmsg = 'Exceed Memory limit. Require : '.$memoryNeeded. " MByte" ;
$this->error = true;
}

...

Es wird also berechnet, wie viel Speicher die Operation benötigt. Anschließend wird der schon von WordPress verwendete Speicher addiert. Der Gesamtwert wird schließlich mit dem PHP Memory Limit verglichen. Ist der Speicherbedarf zu hoch, wird eben diese Fehlermeldung ausgegeben und die Thumbnailerzeugung abgebrochen.

Wie sieht die Formel aus?

In der Funktion kommt folgende Formel zum Einsatz:

$
(Width * Height * Bits * \frac{Channel}{8} + 64K) * Tweakfactor \\
= (Width * Height * 8 * \frac{Channel}{8} + 65536) * 1.68
$

Beispiel

Eines meiner Bilder hat $ 2847 * 1600 $ Pixel und das Dateiformat .jpg. Dabei scheint der Wert für channel = 3 zu sein.

$
(2847 * 1600 * 8 * \frac{3}{8}) + 65536) * 1.68 \\
= 23068308.48 Byte
$

Dies entspricht dem für die Operation benötigten Speicher. Nun Addition mit dem bereits verwendeten Speicher.

$
23068308.48 Byte + 57.87 MByte \\
= 22.0 MByte + 57.87 MByte \\
= 79.87 MByte
$

Das deckt sich fast mit den 78.31 MByte aus meiner Fehlermeldung.

Problemlösung

Die Fehlermeldung trat bei mir auf, weil der insgesamt benötigte Speicher mit 78 MByte die zur Verfügung stehenden 64 MByte überschritt. Dadurch wurde die Erzeugung der Thumbnails unterbunden. Durch das Auskommentieren des Funktionsaufrufes zur Berechnung des Speicherbedarfes, funktioniert die Generierung der Thumbnails wieder. Im Prinzip müsste mein WordPress dann mehr Speicher verbrauchen, als serverseitig zur Verfügung gestellt werden sollte. Falls die Berechnung auf Basis der Werte und Formeln korrekt ist. Aber wie dem auch sei, es geht wieder.

Die oben erwähnten Zeilen in der wp-content/plugins/nextgen-gallery/lib/gd.thumbnail.inc.php [Zeilen 166-169 in der Pluginversion 3.1.3] sehen nun also so aus:

// if($this->error == false) {
// Check memory consumption if file exists
// $this->checkMemoryForImage($this->fileName);
// }

Die Idee zu dieser Lösung stammt ebenfalls von Alex Rabe und wurde hier im WordPress Forum diskutiert.

Zu diesem Thema interessieren mich eure Erfahrungen ganz besonders. Also hinterlasst mir einen Kommentar, wenn dieser Ansatz bei euch funktioniert oder auch nicht funktioniert hat.


Diesen Beitrag teilen:
Facebooktwitterredditpinterestlinkedinmail

Ein Gedanke zu „WordPress Plugin NextGEN Gallery „Exceed Memory limit“ gelöst“

Schreibe einen Kommentar

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