BLANK PAGE nach Aktivierung eines OXID Modules | Kussin

BLANK PAGE nach Aktivierung eines OXID Modules


31.05.2017 | Daniel Kussin | OXID eSales

Vor ein paar Tagen hatten wir ein merkwürdiges Problem und zwar haben wir ein paar OXID Module aktiviert und plötzlich ging nichts mehr bzw. wir sahen die PHP BLANK PAGE. I.d.R. deutet dieses Phänomen auf einen Programmierfehler hin, allerdings hatten wir nicht modifiziert, sondern nur ein bzw. mehrere Module aktiviert. Nachdem wir mit einer kleinen SQL Abfragen alle Module wieder deaktiviert hatten, lief OXID wieder, aber sobald wir wieder mehrere Module aktiviert hatten, war gab es wieder die Weiße Seite und wir konnten auch kein fehlerhaftes Modul ausmachen. Die Lösung zeigen wir Ihnen.

Nach unzähligen Versuchen die Module in unterschiedlichen Reihenfolgen zu aktivieren mit dem immer gleichen Ergebnis des Shopausfalls konnten wir schließlich den Fehler lokalisieren. Es lag an der Datenfeldlänge von oxvarvalue in der Tablelle oxconfig.
oxvarvalue hat im OXID Standard das Format blob, mit einer maximalen Größe von 65535 bytes (64 KB). Nachdem wir mit folgendem SQL Query das Format mediumblob, mit einer maximalen Größe von 16777215 bytes (16 MB) geändert hatten, war das Aktivieren der Module wieder kein Problem:

ALTER TABLE `oxconfig` CHANGE COLUMN `OXVARVALUE` `OXVARVALUE` BLOB NOT NULL COMMENT 'Variable value' AFTER `OXVARTYPE`;

Aber wieso hat das Aktivieren der Module etwas mit der Größe des eines Datenbankfeldes zu tun? Dazu muss man die Datenbanklogik von OXID verstehen. OXID speichert die Modulstatus, also aktiviert oder deaktiviert in einem PHP Array welches dann als serialize Zeichenkette (String) (siehe http://php.net/manual/de/function.serialize.php) in der Datenbank gespeichert wird. Umso mehr Module aktiviert werden, umso länger wird die Zeichenkette und überschreitet bei zu vielen Modulen die Länge von 64 KB und dann gehen beim Speichern Teile der Zeichenkette verloren und OXID kann nicht mehr ausgeführt werden.

Übrigens, Sie können alle OXID Module mit Hilfe des folgenden SQL Queries über die Datenbank deaktivieren:

DELETE FROM oxconfig WHERE oxvarname IN (
	"aDisabledModules",
	"aLegacyModules",
	"aModuleFiles",
	"aModulePaths",
	"aModules",
	"aModuleTemplates"
);