Data Access Objects mit Propel
Geschrieben von Harald Lapp in PHP um 21:52
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.:
- $address = new Address();
- $address->setName('Kunsthalle Schirn');
- $address->setCity('Frankfurt');
- $event = new Event();
- $event->setAddress($address);
- $event->setName('Van Gogh - Seine unbekannten Werke');
- $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.
Umzug Nummer 3
Geschrieben von Harald Lapp in Allgemeines um 00:55
Ich habe es geschafft mein Blog innerhalb eines Jahres dreimal umzuziehen
. Im Januar habe ich ja mit WordPress angefangen. Dass WordPress nicht meinen Anforderungen entspricht, habe ich eigentlich recht schnell gemerkt. Damals machte ich mich auf die Suche nach einem 'guten' Blog-System und wurde mit Serendipity fündig. Mein Umzug im Juli hatte auch gar nichts mit Serendipity zu tun sondern hatte andere Gründe. Nun habe ich also von Juli bis gestern pLog bzw. lifetype, wie es jetzt heisst, verwendet. pLog ist eigentlich gar nicht schlecht. Vorallem eignet es sich sehr gut für Massenbetrieb von Blogs. Trotzdem habe ich Serendipity vermisst - ich weiss nicht, irgendwie ist mir Serendipity sympathischer...
Mit Serendipity habe ich jetzt auch alle meine Artikel beisammen, die ich dieses Jahr mit den verschiedenen Blog-Systemen geschrieben habe - die Importfunktion von Serendipity ist einfach unschlagbar. Ich muss die nächsten Tage nur nochmal die Artikel aus pLog neu kategorisieren, das hat beim RSS-Import leider nicht automatisch geklappt (ist aber glaube ich kein Serendipity-Problem, weil ich schon genug Imports inkl. Kategorien über RSS erfolgreich durchgeführt habe). Ausserdem muss ich noch die ganzen Bilder wieder hochladen...
Java Application Server mit PHP Support
Geschrieben von Harald Lapp in PHP um 02:36
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
Geschrieben von Harald Lapp in Programmierung um 02:02
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.
Probleme mit ssh unter Mac OS X 10.4.3
Geschrieben von Harald Lapp in Mac OS X um 01:40
Seit meinem Mac OS X upgrade habe ich nun schon das zweite mal ein sehr seltsames Problem mit ssh. Per ssh -vvv kann folgende Meldungen sehen (Ausschnitt):
...
debug1: Remote protocol version 2.0, remote software version OpenSSH_3.4p1 Debian 1:3.4p1-1.woody.3
debug1: match: OpenSSH_3.4p1 Debian 1:3.4p1-1.woody.3 pat OpenSSH_3.2*,OpenSSH_3.3*,OpenSSH_3.4*,OpenSSH_3.5*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_3.8.1p1
debug3: Trying to reverse map address xxx.xxx.xxx.xxx.
debug1: An invalid name was supplied
Cannot determine realm for numeric host address
debug1: An invalid name was supplied
A parameter was malformed
Validation error
...
wenn ich lange genug warte (ca. 30 sekunden) klappt der login dann trotzdem. Seltsam finde ich, dass das Problem nicht immer, sondern nur manchmal auftritt. Auf der Suche nach einer Problemlösung bin ich u.a. auf eine Usenet Diskussion gestossen. Ich bin wenigstens nicht der einzige mit einem derartigen Problem - sehr beruhigend.
Irgendwo anders - ich glaube im Apfeltalk Forum - las ich, dass man das Problem am einfachsten darüber löst, indem man sich openssh über fink besorgt, da dieses ein direkter Port ist und keinen Apple-eigenen Code enthält. Mmmmm... ich werde das mal probieren. Dennoch würde mich eine Problemlösung interessieren, die mit der Apple-eigenen openssh Version funktioniert.
Mac OS X 10.4
Geschrieben von Harald Lapp in Mac OS X um 00:20
Ich bin gerade sehr begeistert - wirklich seeeehr! Nachdem meine Vorfreude bezüglich Mac OS X 10.4 vor dessen erscheinen sehr gross war, hat es dann doch bis gestern gedauert, bis ich endlich den Umstieg gewagt habe. Nicht zuletzt auch wegen der vielen negativen Berichte habe ich lange gezögert. Es gibt ja einige Leute, die von Performance-Problemen mit dem neuen Mac OS berichtet haben.
Diese kann ich nicht nachvollziehen. Beim ersten Start nach der Installation war alles sehr langsam. Der Start dauerte ungefähr doppelt so lange wie unter 10.3.9 und auch das Starten und Arbeiten mit Applikationen war nicht sonderlich performant.
Ich nehme an, dass dieses Phänomen mit der noch nicht abgeschlossenen Installation bzw. Konfiguration zusammenhing. Einige Starts später - also heute - kann ich nur sagen: der Tiger hat für mich definitiv einen Performance-Schub gebracht. Der Start ist schnell wie eh und je, die Performance der Applikationen ist meiner Ansicht nach um einiges höher als unter Mac OS X 10.3.9.
Unter letzterem hatte ich zum Schluss so einige Probleme vor allen dingen mit meinem Lieblingsbrowser Safari. Ab 6-8 geöffneten Tabs war dieser einfach nur noch langsam. Wartezeiten beim Wechseln zwischen den Tabs, das "Glücksrad" beim Scrollen etc. sehr nervig. Das scheint aber der Vergangenheit anzugehören. Ich habe das Gefühl, dass meine Anwendungen alle viel flüssiger laufen...
...mal gespannt, wie sich das ganze so entwickelt.
Bäume in MySQL
Geschrieben von Harald Lapp in Datenbanken um 01:30
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.




