Das Nextgen Galerie Plugin für WordPress killt das Blog System indem es die Tabelle wp_options füllt und füllt und füllt. Dieses Problem ist mir bei Analyse einer lahmenden WordPress Seite untergekommen. Die Tabelle wp_options enthielt hier bereits mehr als 50.000 Einträge.
Nach Recherche im Netz ist das Problem schon bei einer früheren Version der Nextgen Galerie aufgetreten. Es gibt sowohl auf WordPress.org einen entsprechenden Bericht zur Problematik wie auch auf mehreren Seiten im Netz Anleitungen zu Workarounds die darauf setzen die unnötigen Einträge per CRON aus der Tabelle zu löschen. Es hat sich aber herausgestellt das scheinbar mit einer der letzten Nextgen Galerie Versionen ein neues Problem hinzugekommen ist, denn nun gibt es nicht mehr nur 2 sondern 3 Typen an Datensätzen die die wp_options Tabelle belasten.

Was bremst WordPress

Die Tabelle wp_options enthält Einstellungen für das WordPress System.  Hier speichert WP Dinge wie Seitentitel, Konfigurationen, Schalter für diverse Funktionen usw.
Plugins können selber eigene Einstellungen dort abspeichern. Diese werden von WordPress dann jeweils wieder geladen und stehen so dem gesammten System zur Verfügung. Die Tabelle besitzt eine Spalte mit dem Namen AUTOLOAD. Alle geflaggten Einträge mit AUTOLOAD = YES werden automatisch von WP geladen, egal ob sie letzten Endes gebraucht werden oder nicht.
Auch das Nextgen Plugin erstellt Mengen dieser Einträge. Je mehr Einträge die Nextgen Galerie in der Tabelle wp_options erstellt umso langsamer wird das komplette WordPress System. Die Seite wird nicht alleine durch die Anzahl der Einträge die aus der mySQL Datenbank gelesen werden eingebremst. mySQL ist da sehr performant und hat damit selbst kein Problem. Die Einträge werden aber nach dem Lesen aus der mySQL entsprechend noch einmal Zeile für Zeile verarbeitet damit sie zur Verfügung stehen. Dies in Summe hat einen fatalen Einfluss auf die Seite wenn 50.000 oder mehr Zeilen in wp_options enthalten sind. Dies führt zur Überlastung des Webservers, einer langsamen Antwortzeit der Seite, bis zum Internal Server Error oder php Timeout. Die viel zuviel geladenen Daten treiben den Speicherverbrauch von WordPress um ein vielfaches in die Höhe: Habt ihr kein hohes memory_limit für php auf eurem Server wird eure Webseite schon alleine daran sterben.
Ein Teil der Probleme dürfte auch darauf zurückzuführen sein das bei 10.000+ Einträgen die mySQL Datenbank uneffektiv die Datensätze mit AUTOLOAD = yes lesen kann da die Spalte keinen Index besitzt.

Was passiert da

Es lässt sich nicht genau erklären was da schief läuft. Ich habe mehrere WP Installation mit der Nextgen Galerie angesehen. Die Systeme sind unterschiedlich davon betroffen, eine Installation habe ich gefunden die das scheinbar gar nicht kennt. Warum diese Einträge passieren, in dieser Menge, kann ich nicht ausmachen. Es wundert mich das Photocrati bisher keinen ernsthaften Versuch unternommen hat das zu lösen. Eventuell passiert das auch erst im Zusammenspiel mit anderen Plugins….
Auch meine Seite hier war davon betroffen. Noch nicht so stark verlangsamt war die Seite, aber die Performance hat sich auch hier deutlich verbessert nach dem Einsatz eines Workarrounds. Dabei hatte meine wp_options Tabelle nur ca. 3.000 Einträge. Auch das sind zu aber zu viele bei meiner einen Galerie die ich zur Zeit hier zeige!
Außerdem verwundert mich stark was die Nextgen Galerie in der wp_options Tabelle speichert. Es cached hier ganze Renderings kompletter Galerie Seiten. Nun kann man sicher drüber diskutieren, aber ich bin der Meinung das praktisch eine Art HTML Cache nichts in einer Setup Tabelle zu suchen hat. Ich würde so etwas nicht programmieren!

Workarround

Dieser Workarround kann nur eine Lösung auf Zeit sein. Photocrati muss hier tätig werden. Ich habe eine Datei erstellt mit dem Namen wp-nextgen-clean.php. Diese legt man in das WordPress Stammverzeichnis. Sie benutzt die Angaben zur Datenbank aus der wp-config.php und entfernt alle relevanten Einträge aus der wp_options Tabelle. Ich lasse das Script aktuell per CRON alle 10 Minuten laufen, das Intervall bei euch hängt sicher auch ein wenig von eurem Traffic ab. Ich triggere die Ausführung per CRON mit wget:

wget –delete-after https://powie.de/wp-nextgen-clean.php

Ihr könnt das Script hier Downloaden: 

SQL

$sql = "DELETE FROM ".$table_prefix."options
WHERE option_name like '_transient_%'
OR option_name like 'displayed_galleries%'
OR option_name like 'displayed_gallery_rendering%'";

Update 10.01.2014

Photocrati hat endlich reagiert und verspricht Besserung. Im WordPress Forum wurde geschrieben:

All – We are bringing in more improvements for how transients are handled and cleared with our next release, including the ability to specify the TTL for when the caches are cleared. We expect this to have a significant impact on this issue.