PHPs neues Extension-Gewand
Artikel erschienen in Swiss IT Magazine 2004/17
Neben den Änderungen innerhalb der Zend Engine wurden auch zahlreiche Extensions hinzugefügt oder überarbeitet. In PHP 5 wurde vor allem der steigenden Bedeutung von XML Rechnung getragen. Während das Parsen von XML in PHP 4 relativ mühsam und fehleranfällig war, wurden nun sämtliche existierenden Extensions (DOM, SAX…) auf der Basis der leistungsfähigen libxml2 des Gnome-Projekts neu entworfen. Der XSLT-Support wurde auf die libxslt umgestellt. So ist zusammen mit dem Support für Streams eine äusserst mächtige Umgebung zum XML-Handling entstanden.
Wohl die grösste Erleichterung für eine schnelle Entwicklung dürfte Christian Stockers SimpleXML-Extension sein, die zur PHP-Standardinstallation gehört und mit wenigen Function-Calls über Objekt-Properties und -Interatoren einen einfach Zugang zu XML-Dokumenten beliebiger Grösse und Komplexität bietet. Durch die Integration eines XPath-Interfaces ist zudem die Navigation innerhalb eines XML-Baums stark vereinfacht worden.
Weil sämtliche Extensions auf der libxml2 basieren, ist es zudem möglich, Objekte zwischen den einzelnen Extensions auszutauschen.
Dies ermöglicht dem Entwickler, für jede Aufgabe das jeweils am besten geeignete Werkzeug zu verwenden. Ein denkbarer Anwendungsfall ist, mit DOM ein Dokument einzulesen, es zu validieren und es dann zwecks einfacherer Verarbeitung an SimpleXML zu übergeben (siehe Listing 3).
Last but not least erlaubt nun die XSLT-Extension ein Aufruf von PHP-Funktionen innerhalb von XSLT-Stylesheets. Damit ist es möglich, zusätzliche Informationen während des Transformationsvorgangs einzuführen, was früher teilweise nur beschwerlich möglich war, selbst wenn es nur um etwas Triviales wie einen Timestamp ging.
Das Lizenzdurcheinander rund um MySQL und PHP hat im Vorfeld von PHP 5 für viel Verwirrung gesorgt. Da MySQL die Lizenz der Client-Library auf die GPL geändert hat, wäre es nicht mehr möglich gewesen, die MySQL Client Library im Rahmen von PHP mitauszuliefern. Auch wenn dies durch eine sogenannte FOSS-License-Exception seitens MySQL wieder ermöglicht wurde, haben sich die PHP-Entwickler entschlossen, die MySQL Client Library nicht mehr mit PHP mitzuliefern. Dies mag zwar auf den ersten Blick das Leben nicht gerade einfacher machen, da man sich nun selber um die Beschaffung der Client-Library kümmern muss, ist aber ein sinnvoller Schritt: Die klassische MySQL-Extension wie auch die Client-Library waren mit der Zeit immer schwieriger zu pflegen und hinkten bezüglich Aktualität dem «Original» immer weiter her. So hat man sich nun entschieden, die alten Zöpfe abzuschneiden und die MySQL-Extension genauso wie den XML-Support komplett neu zu konzipieren. Mysqli, so der Name der neuen Extension, muss nun wie die Extensions für PostgreSQL, Oracle oder andere Datenbanken gegen die Originalbibliotheken des Softwareherstellers gelinkt werden. Mysqli bietet fast alle Funktionen von MySQL 4.1 und verfügt wie die XML-Extensions über ein objektorientiertes Interface.
Sozusagen an die Stelle von MySQL tritt nun die dateibasierende SQL-Bibliothek SQLite (Ausführliche Einführung in InfoWeek 02/2004), die nun standardmässig mit PHP installiert wird und Datenbankapplikationen ermöglicht, ohne dass ein entsprechender Server vorhanden und verwaltet werden muss. Dies dürfte vor allem für Low-Cost-Hosting und –Applikationen interessant sein, bei denen Operationen mit Textdateien zu langsam oder zu aufwändig sind, ein richtiges RDBMS aber zu viel Overhead einführt. Die Benutzung von SQLite verhält sich identisch wie bei anderen Datenbanken, die mit PHP angesprochen werden können, wie Listing 2 zeigt.
Listing1: XML-Verarbeitung, DOM und SimpleXML
Neben den Hauptbaustellen XML und MySQL finden sich weitere Extensions, welche nun direkten Zugriff auf die benötigten Funktionalitäten bieten und nicht erst mühsam in PHP ausprogrammiert werden müssen. Sehr viel Aufsehen hat die neue SOAP-Extension erregt, die nun im Gegensatz zu NuSoap und Co. komplett in C geschrieben ist und die Arbeit mit SOAP-Web-Services entsprechend beschleunigt. Sie wurde von Dimitri Stogov, seines Zeichens ehemaliger Entwickler des Bytecode-Caches TurckMMCache, entwickelt, der nun bei Zend angestellt ist.
Ebenfalls neu dazugekommen ist die Extension Tidy, die bislang alleine über die PECL (PHP Extension Community Library, http://pecl.php.net) zu beziehen war. Tidy basiert auf dem Tool HTML Tidy (http://tidy.sf.net) und wird vor allem zum Aufräumen und Konvertieren von HTML-Dokumenten in XHTML oder XML verwendet. Dies ist besonders dann nützlich, wenn es darum geht, grosse Mengen von HTML-Dokumenten zum Beispiel in XHTML zu konvertieren oder Benutzereingaben in eine valide Form zu bringen.
Last but not least wurde die alte COM-Extension, welche die Brücke zu Windows-Funktionen und -Applikationen mit COM-Support schlägt, komplett überarbeitet, was erst durch das neue Objektmodell der Zend Engine 2 erlaubt wurde. So wurden viele Limitierungen und Probleme aus der Welt geschafft und gleichzeitig Support für .Net hinzugefügt, wodurch man in der Lage ist, mit Hilfe der Com_dotnet-Extension .Net-Objekte über die COM-Interoperabilitätsschicht für .Net zu laden und innerhalb von PHP zu verwenden.
Dass PHP nun nach der Version 5 nicht still steht, zeigen die ersten Arbeiten an Tests für einen neuen Bytecode-Interpreter, der möglicherweise die Zend Engine im nächsten Major-Release ersetzen könnte: Parrot. Parrot ist eine Virtual Machine, die Bytecode von Interpreter-Sprachen ausführt und eigentlich für Perl 6 gedacht ist, doch auch für andere Sprachen verwendet werden kann. Parrot ist deshalb interessant, da es eine ausserordentlich massive Geschwindigkeitssteigerung (plus/minus Faktor 10) für CPU-intensive Algorithmen verspricht. Doch bis zum Thema Parrot/PHP aussagekräftige Resultate vorliegen, dürfte es noch etwas dauern. Dies, obwohl bereits ein Compiler, der 99 Prozent der PHP-Sprachelemente verarbeiten kann, existiert und nicht-optimierter Bytecode für die meisten PHP-Strukturen auch schon erzeugt werden kann.
Listing 2: Dantenbankoperationen mit SQLite