Too Cool for Internet Explorer

Data Access Objects mit Propel


Ich verwende schon seit einiger Zeit Creole als Datenbankabstraktionslayer und bin damit super zufrieden. Creole dient auch als untere Schicht für das Projekt Propel.

Bei Propel handelt es sich um eine Implementierung des Entwurfsmusters 'Data Access Obects'. Ziel ist es Datenbankzugriffe von der Anwendung zu entkoppeln. Beim Einsatz von DAO werden Zugriffe per SQL auf eine Datenbank innerhalb einer Applikation vermieden. SQL wird nur noch innerhalb der DAO Bibliotheken verwendet, der Entwickler einer Anwendung basierend auf Data Access Objects greif nur noch auf die bereitgestellten Objekte zu.

Eigentlich habe ich Propel in meiner Unwissenheit immer als 'bloated' betrachtet. Es ist eine recht umfangreiche Bibliothek und benötigt das PHP Build System Phing. Die Abhängigkeiten arten schon etwas aus, allerdings lassen sich alle benötigten Bibliotheken bequem über PEAR installieren:

$> pear install http://creole.phpdb.org/pear/creole-current.tgz
$> pear install http://creole.phpdb.org/pear/jargon-current.tgz

$> pear install http://phing.info/pear/phing-current.tgz

$> pear install http://propel.phpdb.org/pear/propel_generator-current.tgz
$> pear install http://propel.phpdb.org/pear/propel_runtime-current.tgz

Die Runtime Bibliotheken werden nur auf einem System benötigt, auf dem das Propel-basierte Projekt später laufen soll. Umgekehrt müssen auch die Generator Bibliotheken nur auf einem System installiert werden, auf dem die Klassen generiert werden.

Der Einsatz von Propel gestaltet sich einfacher als ich dachte. Eine Datenbank wird per XML beschrieben. Es können auch bestehende Datenbanken gelesen werden und die XML Struktur automatisch generiert werden. Das habe ich allerdings noch nicht ausprobiert. Das Erstellen der XML Datei für die Datenbankstruktur ist relativ einfach und geht schnell von der Hand. Es werden Tabellen und Spalten definiert und Abhängigkeiten über Fremdschlüssel.

Aus einer fertigen XML Datenbankstruktur wird dann zum einen ein SQL-File zum Einspielen in die Datenbank generiert, zum anderen werden alle PHP Klassen erstellt, die zum Zugriff auf die Daten Objekte benötigt werden. Hier kommt das Build System Phing zum Einsatz. Beim Einsatz von Propel erspart man sich das (oftmals auch durchaus nervige) Schreiben von SQL Anweisungen - das Einfügen eines neuen Datensatzes in die Datenbank gestaltet sich dann so einfach wie z.B.:

  1. $address = new Address();
  2. $address->setName('Kunsthalle Schirn');
  3. $address->setCity('Frankfurt');
  4.  
  5. $event = new Event();
  6. $event->setAddress($address);
  7. $event->setName('Van Gogh - Seine unbekannten Werke');
  8.  
  9. $event->save();

Beim Speichern einer Ausstellung wird im obigen Beispiel automatisch zunächst eine neue Adresse angelegt und der Primary-Key des Datensatzes als Adress-ID in der Ausstellung übernommen. Auch Abfragen der Datenbank gestalten sich äusserst einfach.

Propel benötigt mindestens MySQL der Version 4.0.x. Es läuft allerdings auch mit 4.1.x sowie - wie bei mir - mit den Versionen 5.0.x. Allerdings werden neue Features, insbesondere der Version 5 nicht unterstützt. Ausserdem können alle Datenbanken eingesetzt werden, die Creole unterstützt. Neben dem schon erwähnten MySQL wären das PostgreSQL, MS SQL Server und SQLite.



Java Application Server mit PHP Support


Resin von Caucho ist ein Java Application Server mit PHP Unterstützung. PHP Code wird intern in Byte Code übersetzt und soll so bis zu sechs mal schneller sein als das entsprechende Programm unter Apache mit mod_php. Benchmarks, die diese Behauptung untermauern, sucht man leider vergebens.

Im Moment sind die Informationen noch recht spärlich gesäht. Hier kann man sich zumindest einiges rausziehen: so wird wohl PHP5 unterützt - allerdings noch nicht der komplette Sprachumfang.

Neben der Geschwindigkeit soll ein Vorteil der sein, dass man sehr einfach in Java geschriebene Module unter PHP ansprechen kann.

Klingt interessant - auch wenn die Informationen doch recht dünn sind. Sollte man mal im Auge behalten.



modsecurity - Open Source Web Application Firewall


ModSecurity ist ein Apache Modul über das man die Sicherheit von Webapplikationen erhöhen kann und unter Umständen Attacken auf bekannte oder unbekannte Sicherheitslücken verhindern kann. Hierzu zählen z.b. Cross-Site Scripting Attacken oder SQL-Injections.

ModSecurity ist in erster Linie für den Einsatz bei bekannten Sicherheitsproblemen konzipiert. So können unter Umständen wirksam Attacken abgewehrt werden, für die es seitens des Herstellers einer Dritt-Software noch keinen Patch gibt oder man den Patch aus welchem Grund auch immer nicht einspielen kann. ModSecurity analysiert alle eingehenden Requests und verwirft solche, die über festgelegte Regeln als sicherheitskritisch eingestuft werden. Regeln können als XML Datei mit einer einfachen Syntax für die verschiedensten Fälle erstellt werden.

Das Tool steht unter der GNU General Public License, alternativ kann auch eine kommerzielle Lizenz erworben werden.

Leider hatte ich noch nicht die Zeit ModSecurity richtig auszuprobieren und zu testen.




Bäume in MySQL


Das Abbilden von Baumstrukturen in Datenbanken stellt oft eine grosse Herausforderung dar. Wenn die Datenbank nicht gerade über eine Funktion zum effizienten Auslesen von hierarchischen Strukturen bietet, wie z.b. Oracles SQL über CONNECT BY, hat man ein Problem: Wie kann man einen Ast inkl. seiner Kinder auslesen?

Es gibt einige suboptimale Ansätze wie das Speichern des Pfades als String in einer Tabellenspalte oder die Referenzierung über eine Parent ID, bei der man gezwungen ist applikationsseitig eine Funktion zu schreiben, die rekursiv alle Kinder eines Astes ausliest und dabei in jeder Ebene eine neue Abfrage an die Datenbank stellt.

Nested Sets sind da schon sehr viel effizienter - beim Auslesen einer Datenbank. Das Einfügen und Löschen bzw. Verschieben von Ästen ist jedoch mit erheblichem Aufwand verbunden, da oft eine Vielzahl an Datensätzen aktualisiert werden müssen.

Jan Kneschke, Entwickler bei MySQL AB, hat nun eine weitere Möglichkeit vorgestellt, die von einem neuen Feature von MySQL 5 gebrauch macht, den 'Stored Procedures'. 'Stored Procedures' in MySQL können rekursiv ausgeführt werden, sodass das Rekursive Auslesen einer Datenbanktabelle über die Referenzierung der Parent ID komplett datenbankseitig erfolgen kann.

Auf seiner Projektseite kann man eine Bibliothek herunterladen, die die wichtigsten Funktionen zum Arbeiten mit Bäumen bereitstellt. Benötigt wird eine aktuelle Version von MySQL 5 z.b. die aktuell als stabil geltende Version 5.0.16. Die Bibliothek steht unter MIT Lizenz und kann unter Einhaltung der Regeln somit auch kommerziell verwendet werden.