Von PHP/MySQL zu ZOPE - Migrationsstrategien am Beispiel von sachunterricht-online.de
Einleitung
Der Vortrag will einen subjektiven Erfahrungsbericht über Um- und Lernwege auf dem Weg zu einem Rapid-Database-Application-Development auf Basis von ZOPE geben.
Die Erfahrungen wurden vornehmlich bei der Entwicklung und Migration des Internetportals sachunterricht-online.de gesammelt.
Das Ziel der Träume:
- Eine kleine Datenbankanwendung muß in 5 Minuten zu realisieren sein,
- eine größere Datenbankanwendung sollte nicht länger als 10 Minuten dauern.
Wie weit dieses Ziel bis hierhin erreicht ist, sollte am Ende des Vortrags klar geworden sein.
Die Projektidee - Ein Internetportal für den Sachunterricht
Am Zentrum für Lehrerbildung der Universität Bielefeld ist im Arbeitsbereich "Didaktik des Sachunterrichts" die Idee entstanden, sämtliche Internetressourcen zum Sachunterricht über ein datenbankbasiertes Internetportal zu bündeln.
Die Projektgruppe besteht aus 5 Personen, die sich im Verhältnis 4 zu 1 mit Anteilen ihrer regulären Stellen auf Content und Programmierung verteilen.
Für die technische Entwicklung von sachunterricht-online.de stehen im Prinzip 25% einer 1/2 Mitarbeiterstelle zur Verfügung.
Das Projekt steht unter dem Sachzwang, möglichst effiziente Routinen zur Erstellung und Administration neuer Datenbankanwendungen für das Internetportal zu entwickeln.
Das übliche Chaos - PHP, MySQL, Apache
Ausgangspunkt für das Internetportal war eine Linkdatenbank zu Unterrichtseinheiten für den Sachunterricht auf Basis von PHP/MySQL.
Dieses Angebot wurde rasch durch eine Datenbank zu Studienseminaren und Studienorten für den Sachunterricht ergänzt.
Web-Zugriff: Einzelne PHP-Scripte, die eine MySQL-Datenbank abfragen, wurden im Dateiverzeichnis eines Apache über statische HTML-Seiten zusammengebunden.
Datenbank-Zugriff: Die anfängliche Pflege der Datensätze über ein MS-Access-Frontend stellte sich als zu betreuungsaufwändig heraus, weil häufige Updates der Clients notwendig waren. Es wurde deshalb relativ schnell ein Framework für einen PHP-basierten Datenbankzugriff über das Web auf die MySQL-Datenbank programmiert.
Neuordnung des Chaos - Ein eigenes CMS auf PHP/MySQL-Basis
Der Wunsch...
- ein einheitliches, aber leicht änderbares Layout zu realisieren,
- dynamische Navigationselemente zu nutzen,
- Nutzer- und Rechteverwaltung auf einzelnen Seiten zu ermöglichen,
- PHP-Code für Routineaufgaben zu modularisieren,
führte zur Programmierung eines eigenen CMS auf Basis von PHP/MySQL.
Sämtliche HTML- und PHP-Seiten wurden in einer MySQL-Datenbank abgelegt und dynamisch ausgewertet. Das CMS bestand aus einem Publisher (mycms.php) und einem Admin-Frontend (smcym.php) auf Basis von PHP.
Mit zunehmender Komplexität nahm die Entwicklung und Erweiterung des CMS mehr Zeit in Anspruch als die Realisierung der gewünschten Datenbankanwendungen für das Internetportal.
Um sich wieder auf das wesentliche konzentrieren zu können, mußte eine günstige und hochflexible Alternative zum bestehenden myCMS gefunden werden.
Schluss mit Chaos - Die sanfte Migration nach ZOPE
Nach einer erfolglosen Evaluierung existierender CMS auf Basis von PHP wurde der Internet Application Server ZOPE in die engere Wahl gezogen.
Nach dem mehrmaligen Durchspielen des Elvis-Tutorials wurde schnell klar, dass ZOPE die wesentlichen Features des myCMS wesentlich eleganter implementiert hatte und offenbar noch weitere Features zu bieten hatte.
Als anfängliche Vorteile von ZOPE stellten sich heraus:
- Keine Lizenzkosten
- Einfache Installation
- Hervorragende Dokumentation für den Einstieg: Das ZopeBook
- Offenes und damit ausgesprochen flexibles System
Im Anbetracht der knappen Ressourcen wurde entschieden, sachunterricht-online.de möglichst sanft, d.h. unter größtmöglicher Wiederverwendung der bestehenden PHP-Scripte zu migrieren.
Ein Umweg für den Übergang - Der PHParser
Um bereits so früh wie möglich die Vorteile von ZOPE nutzen zu können, ohne alle bestehenden PHP/MySQL-Scripte nach Python übersetzen zu müssen, wurde der PHParser entwickelt.
Alternativen: Eine Evaluation des bereits existierenden PHPDocument ergab mehrere Defizite in der Implementierung, so dass eine Eigenentwicklung für eine Produktionsumgebung angestrebt und realisiert wurde.
Funktionsweise: Der PHParser ruft einen externen PHP-Intepreter mit entsprechend gesetztem Web-Environment auf. Das zurückgelieferte Resultat wird anschließend in das ZOPE-Response-Object integriert. Dabei ist als Nebeneffekt ein Fehler in der Behandlung von HTTP-Headern durch ZOPE aufgedeckt und gefixt worden.
Features: Viele PHP-Scripte können mit dem PHParser nahezu ohne Änderungen unter ZOPE ausgeführt werden. Architekturbedingte Inkompatibilitätsprobleme mit PHP-spezifischen "Includes" und "Sessions" werden dadurch gelöst, dass DTML-Code in die PHP-Scripte integriert werden kann.
Vom ZMI in die ZODB - Das AbracadabraObject
Das Zope-Managament-Interface (ZMI) und der objektorientierte Zugriff über DTML und Python auf die ZODB stellten sich als äußerst effiziente Möglichkeit für die Administration und Pflege des Internetportals sachunterricht-online.de heraus.
Problem: Nach wie vor lagerten alle wesentlichen Daten in der MySQL-Datenbank, für die weiterhin Administrationsscripte aufgesetzt werden mußten. Zudem ist für eine einheitliche Suchfunktion eine durchgängige Indizierung relationaler Datenbanken nur umständlich realisierbar.
Idee: Die anfängliche Idee, für sämtliche Datenbankinhalte einzelne ZClassen oder Produkte in ZOPE aufzusetzen, wurde als zu aufwändig betrachtet. Gebraucht wurden letztlich nur gleichförmige DTML-Dokumente, die aus Properties und einem Template bestehen. Allerdings bietet das ZMI von sich aus nur die Möglichkeit, derartige Objekte umständlich per Copy & Paste zu erstellen.
Lösung: Um die "händische" Arbeit beim Erstellen derartiger Objekte überflüssig zu machen, wurde das AbracadabraObject entwickelt, was eine einfache Möglichkeit zum Klonen vorbereiteter Objekte per ZMI zur Verfügung stellt.
Am Ziel der Träume? - Das PropertyObject
Um das AbracadabraObject einen weiteren Schritt in Richtung "Usability" zu erweitern, wurde es um ein generisches PropertyObject ergänzt.
Ein PropertyObject ist ein ZOPE-Objekt, was ausschließlich aus Properties besteht. Ein PropertyObject-Manager kann jedem PropertyObject ein Template zuweisen, mit dem das PropertyObject gerendert und indiziert wird. Anschließend kann der Manager das PropertyObjekt "verschließen", so dass gewöhnliche ZMI-User nur noch mit einer Eingabemaske konfrontiert sind.
PropertyObjects sind CatalogAware, so dass sie sich automatisch im ZCatalog indizieren und aktualisieren. Zudem besitzen sie eine Publishing-Funktion.
Zusammen mit dem AbracadabraObject kann jetzt mit dem PropertyObject innerhalb weniger Minuten eine Datenbankanwendung für sachunterricht-online.de erstellt werden.
Was noch zu tun ist - Datenimport & QueryObject
Nachdem mit dem AbracadabraObject und dem PropertyObject leistungsfähige Toos zur Pflege von Datenbankinhalten über das ZMI zur Verfügung stehen, kann jetzt damit begonnen werden, die Daten aus der MySQL-Datenbank in die ZODB zu importieren.
Hierfür müssen die entsprechenden ZSQL-Methoden und PythonScripte erstellt werden, die die Daten aus der MySQL-Datenbank auslesen und in PropertyObjects umwandeln.
Entsprechend dem Z-Search-Interface soll jetzt noch ein QueryObject entwickelt werden, was die Erstellung der ZODB-Abfragen auf die PropertyObjects um ein Vielfaches beschleunigen soll. Wie das QueryObject genau aussehen und implementiert wird, ist zum jetzigen Zeitpunkt noch völlig offen.
Zusammenfassung
- Die Migration von PHP/MySQL zu ZOPE stellte sich vor dem Hintergrund des Ziels, web-basierte Datenbankanwendungen in möglichst kurzer Zeit zu erstellen als Glücksgriff heraus. Allerdings waren hierzu einige Erweiterungen des ZMI erforderlich.
- Die Erstellung und Administration eines komfortablen Interfaces zur Pflege der Daten in der ZODB über das ZMI ist mit Hilfe von AbracadabraObject und PropertyObject mittlerweile eine Frage weniger Minuten.
- Eine weitere Optimierung im Bereich der Erstellung der Datenbankabfragen steht mit dem QueryObject noch aus.