Brennpunkt WWW

Mit der am 22. Mai freigegebenen Version 4.0 wandelt sich PHP von der Skriptsprache für kleine und mittlere Webanwendungen zur umfangreichen Middleware-Technik.

In Pocket speichern vorlesen Druckansicht 1 Kommentar lesen
Lesezeit: 14 Min.
Von
  • Tobias Ratschiller
Inhaltsverzeichnis

PHP (aufgelöst: PHP Hypertext Preprocessor) ist eine C- beziehungsweise Perl-ähnliche serverseitige Skriptsprache für Webanwendungen, die nach einer Netcraft-Studie derzeit auf über zwei Millionen Domains für Dynamik sorgt - darunter große Sites wie livebid.amazon.com, ricardo.de oder xoom.com. Spätestens seit dem iX-Artikel zu PHP 3 [1] kennen wahrscheinlich viele die Vorzüge dieser Sprache. Seitdem ist ein knappes Jahr vergangen, eine kleine Ewigkeit in der Webwelt. Und tatsächlich hat sich einiges getan. Die soeben erschienene Version 4.0 setzt neue Maßstäbe.

Das Wichtigste zuerst: PHP 4.0 ist zu großen Teilen rückwärtskompatibel zur ‘alten’ Version 3.0. Die meisten vorhandenen Skripts dürften ohne Änderung unter 4.0 laufen, mögliche Inkompatibilitäten sind auf www.php.net/version4/ dokumentiert.

Mehr Infos

Hinter den Kulissen haben die Entwickler jedoch die komplette Architektur des Systems geändert. PHP besteht jetzt aus drei sauber voneinander getrennten Teilen:

  • dem Parser (Zend Engine),
  • einer Schnittstelle zum Webserver (SAPI) und
  • den einzelnen API-Modulen (zum Beispiel MySQL, FTP, IMAP).

Diese Trennung ermöglicht es beispielsweise, den Parser getrennt einzusetzen; denkbar wäre es, Zend als Makrosprache in einer Textverarbeitung, als Browser-Plugin für clientseitige Funktionen oder als Stored-Procedure-Sprache in Datenbanksystemen zu verwenden. Die klare Definition der Server-API für die Kommunikation mit dem Webserver und die Multithreading-Fähigkeit des neuen Sprachkerns erlauben es PHP, sich als Modul nicht nur in den Apache, sondern auch in den IIS, Zeus, fHttpd und einige weitere Webserver einzuklinken. Die bessere Modularisierung schließlich macht es einfacher, neue Module für PHP zu entwickeln. Zusammen mit der geplanten Dokumentation über die Erweiterung von PHP mit C lässt dies auf noch mehr Funktionen für den Webentwickler hoffen.

Verwendete Apache-Module
PHP 346 123 29,08 %
FrontPage 234 412 19,69 %
mod_perl 99 168 8,83 %
mod_ssl 90 904 7,63 %
ApacheJServ 35 601 2,99 %
Quelle: SecuritySpace.com

Zeev Suraski und Andi Gutmans, zwei Softwareentwickler aus Israel, haben den Sprachkern von PHP komplett neu implementiert. Obwohl die beiden bereits den Parser der Version 3.0 entwickelt hatten, waren sie mit ihrem eigenen Kind nicht recht zufrieden. Für kleinere und mittlere Anwendungen reichte die Performance von PHP 3.0 aus, je größer und komplexer eine Anwendung aber wurde, desto schlechter schnitt die Sprache im Vergleich zu anderen Lösungen ab. Der Grund dafür lag in der Art, wie der Parser vorging: er arbeitete jedes Skript Zeile für Zeile ab und führte sie aus. Optimierungen durch den Parser, zum Beispiel bei Schleifen oder sich wiederholenden Funktionsaufrufen, waren daher schwierig oder gar unmöglich.

Also änderten Zeev und Andi das Konzept radikal: Der neue Parser, die Zend Engine, arbeitet nicht mehr zeilenorientiert, sondern analysiert das Skript, kompiliert es und führt es dann erst aus - eine von Perl bekannte Vorgehensweise. Bei komplexeren Skripts bewirkt das 5- bis 200fache Performance-Steigerungen im Vergleich zu PHP 3.0. Aufgrund dieses anderen Ansatzes stehen gänzlich neue Möglichkeiten zur Verfügung: Beispielsweise kann ein weiterer Optimierungsschritt relativ einfach vorgeschaltet werden. Der Zend Optimizer macht genau das und bringt so einen zusätzlichen Geschwindigkeitsvorteil von 50 bis 100 %. Dieses Apache-Modul ist allerdings nicht im Quelltext verfügbar, sondern ein proprietäres Produkt der Firma Zend Technologies, gegründet von Zeev und Andi in Israel. In Planung befinden sich bereits weitere kommerzielle Addons: Compiler, Debugger und IDE.

Mit dem neuen Parser kamen einige bedeutsame Sprachänderungen. Die wichtigsten davon sind Garbage Collection, verbesserte Objektorientierung und Output Buffering.

Komplexe, mit vielen Variablen oder Datenbankabfragen belastete Skripts führten unter PHP 3.0 zu einem hohen Speicherverbrauch. Wurde einer Variablen ein neuer Wert zugewiesen, blieb der alte dennoch im Speicher. Nicht mehr belegte Ressourcen wurden erst nach Beendigung des Skripts freigegeben. Dank der kurzen Laufzeit der meisten Skripts fiel das selten auf; bei Schleifen, die einige tausend Variablenzuweisungen machten, konnte dieses Verhalten allerdings fatal werden. PHP 4.0 hat ein deutlich verbessertes Speicher-Recycling, das automatisch einen Speicherbereich freigibt, sobald keine Variable mehr auf ihn zeigt. Andererseits wird ein einziger Speicherbereich für mehrere Variablen benutzt, wenn sie denselben Wert haben. Im folgenden Beispiel wird in PHP 4.0 der Wert foo nur einmal im Speicher gehalten, während er in 3.0 redundant gespeichert worden wäre:

$bar = "foo";
$baz = $bar;

Erst wenn $baz einen anderen Wert erhält, reserviert PHP den benötigten Speicher: Das spart Zeit und optimiert den Speicherverbrauch. Variablen lassen sich daher mit Zend tatsächlich freigeben: unset() funktioniert korrekt und gibt den Speicher frei, den die Variable und ihr Wert eingenommen hatten. Ein neuer Datentyp, NULL, ist für undefinierte Variablen reserviert. Nachdem eine Variable mit unset() freigegeben worden ist, besitzt sie den Wert NULL.

Will ein Entwickler die Variable $baz explizit an denselben Wert wie $bar binden, stehen ab 4.0 Referenzen (Aliases, vergleichbar Pointern in C) zur Verfügung:

$bar = "foo";
$baz = &$bar;

Erhält $baz jetzt einen neuen Wert zugewiesen, ändert sich auch der Wert von $bar. Das funktioniert mit allen Datentypen, auch mit Objekten. In Version 3.0 funktionierten Referenzen nur bei Funktionsargumenten, um ein Call-by-Reference zu realisieren.

PHP 4.0 erleichtert den Umgang mit Objekten - in Version 3.0 waren Objekte nicht viel mehr als Sammlungen von Variablen und Funktionen, quasi Packages. PHP ist keine vollständig objektorierentierte Sprache und wird es auch in absehbarer Zukunft nicht werden, aber die Unterstützung für OOP hat sich deutlich gebessert. Erst jetzt bietet PHP bessere Möglichkeiten zur Introspektion, dank Funktionen wie get_class_methods() oder get_declared_classes().

Klassenmethoden lassen sich statisch aufrufen, ohne erst eine Instanz zu erzeugen. Dies geschieht mit der Syntax klassenname::methode(). Dadurch kann eine abgeleitete Klasse eine Methode der Elternklasse erweitern. Ein Beispiel dafür enthält dieses Listing.

class c1
{
function c1()
{
print("Konstruktor c1\n");
}
}

class c2
{
function c2()
{
c1::c1();
print("Konstruktor c2\n");
}
}

$c2 =3D new c2;

Zu beachten ist, dass ab Version 4.0 der Konstruktor einer Elternklasse automatisch aufgerufen wird, falls eine abgeleitete Klasse keinen eigenen definiert. Dekonstruktoren fehlen leider immer noch, ebenso eine Unterscheidungsmöglichkeit zwischen privaten und öffentlichen Eigenschaften und Methoden.

Mit PHP 4.0 ist auch das leidige Problem behoben, dass Objekte nicht in Arrays verschachtelt werden konnten.

Ein weiteres Feature, das durch die deutlichere Trennung zwischen SAPI, Sprachkern und Modulen möglich geworden ist, heißt Ausgabepufferung (Output Buffering). Im gesamten PHP-Source gibt es keine direkte Ausgabe mehr; stattdessen werden dafür PHP-eigene Funktionen, der Output Layer, benutzt. Damit ist es möglich, die erzeugte Ausgabe zwischenzuspeichern.

Wer sich schon einmal über die Fehlermeldung ‘Oops: headers already sent’ geärgert hat, weiß vielleicht, dass diese Meldung beispielsweise erzeugt wird, wenn man versucht hat, einen Cookie zu setzen, nachdem vorher das Skript bereits Daten an den Browser gesendet hat - sei es auch nur durch eine übersehene leere Zeile. Mit PHP 4.0 kann ob_start() am Anfang des Skripts die Ausgabe ausschalten und die Ausgabepufferung aktivieren. Erst am Schluss kommt der zwischengespeicherte Inhalt zur Ausgabe:

ob_start();
print("Papa, mein PHP ist hungrig.");
SetCookie("php", "hungrig");
ob_end_flush();

ob_get_contents() ermöglicht es, den Ausgabepuffer abzufragen, in eine Variable zu übernehmen und zu modifizieren. Damit werden weitere Anwendungen möglich: Beispielsweise ließe sich der Inhalt des Puffers vor der Ausgabe einrücken und formatieren (Pretty Printer). Man könnte Session-IDs in alle Links einbauen oder verschiedene Icons für interne und externe Links in die Seite einfügen. Allerdings dürfte jede Anwendung durch die Ausgabepufferung deutlich langsamer erscheinen, da die Seite nicht mehr so schnell wie möglich beim Benutzer erscheint.

Über 200 neue Funktionen - damit bleiben wenig Wünsche für die Webentwicklung offen. Das wohl mit am meisten Spannung erwartete neue Feature ist die integrierte Session-Bibliothek. Bei PHP 3.0 musste sich der Entwickler selbst um die Verwaltung von Sessions kümmern oder aber eine geeignete Bibliothek (zum Beispiel die PHPLib) bemühen. Entwickler, die dieser zusätzliche Aufwand abschreckte, können sich nun freuen: PHP 4.0 bietet integrierte Funktionen zur einfachen und leistungsfähigen Session-Verwaltung. Variablen, die über mehrere Seitenanfragen hinweg persistent bleiben, werden standardmäßig in Textdateien im Dateisystem abgelegt. Für höhere Performance kann PHP die Daten auch im Hauptspeicher (Shared Memory) vorhalten. Die Alternative bedeutet, eigene Funktionen von Session-Daten zu speichern und die Daten zum Beispiel in eine MySQL-Datenbank zu schreiben. Um Variablen in ein speicherfähiges Format zu konvertieren, benutzt PHP entweder den eingebauten Serializer (serialize()/unserialize()) oder das WDDX-Modul. Der Serializer unterstützt nun auch Objekte - die Workarounds der PHPLib, um Klasseninstanzen zu sichern, gehören damit endgültig einer ‘schlimmen’ Vergangenheit an.

Die Session-Bibliothek ist auch im Weiterreichen der Session-ID sehr flexibel. Standardmäßig speichert PHP die ID als Cookie beim Benutzer. Ist das nicht möglich, weil der Benutzer Cookies deaktiviert hat oder der Browser keine Cookies unterstützt, füllt PHP die Konstante SID mit einem Query-String, den Webautoren an URLs anhängen können. Die können PHP aber auch so konfigurieren, dass es automatisch die Session-ID an alle Links in einer Seite anfügt - damit sind Cookie-lose Sessions ohne Mehrarbeit möglich. Weitere interessante neue APIs:

  • Arrays sind eine der häufigsten Datenstrukturen in der Arbeit mit PHP; deshalb machen sich die Array-Funktionen sofort in der täglichen Arbeit bemerkbar: Von array_flip() bis zu Funktionen für das Sortieren von Arrays mit dem Natural-Sorting-Algorithmus sind neunzehn neue Funktionen vorhanden.
  • LibXML ermöglicht einen DOM-ähnlichen Zugriff auf XML-Dokumente. Diese Bibliothek ist allerdings noch im Betastadium.
  • Mit Hilfe der LibSwf lassen sich Shockwave-Filme mit PHP erstellen.
  • Durch Einbeziehung des Readline-Moduls bewegt sich PHP einen Schritt weiter in Richtung Systemadministrationswerkzeug. Damit lassen sich komfortable Eingabeaufforderungen inklusive History, Befehlsexpansion und Bearbeitungsfunktionen realisieren.

Aus dieser Liste neuer Funktionen und Änderungen ist erkennbar, dass die PHP Group die Bedürfnisse der Entwickler ernst genommen hat. Unzulänglichkeiten wurden zum großen Teil beseitigt, sinnvolle neue Features integriert. In dieser Konstellation ist PHP erstmals für den Einsatz in der komplexen lT-Infrastruktur eines Unternehmens wirklich geeignet. Besonders wichtig für jede Lösung in diesem Kontext sind Möglichkeiten zum Einbinden externer Komponenten. Damit erreicht man einen Leverage-Effekt, der eine bessere Trennung zwischen Business- und Anwendungslogik ermöglicht - und somit kürzere Entwicklungszeiten.

PHP 3.0 unterstützte Microsofts Komponentenmodell COM nur rudimentär: DCOM oder komplexere Komponenten konnten nicht eingebunden werden. Durch die verbesserte Objektorientierung der Zend Engine können Erweiterungen nun Gebrauch von PHPs objektorierentierter Syntax machen. Das COM-Modul ist ein Beispiel dafür: Mit der internen Pseudoklasse COM können COM-Komponenten instanziert werden, auf denen Sie wie bei einem normalen PHP-Objekt arbeiten können:

$conv = new COM("Softwing.EDConverter") 
or die("Unable to instantiate Euro-Converter");
print($conv->Triangulate(10000, "ITL", "DEM"));

Von derselben Syntax macht die Java-Klasse Gebrauch. Direkt von PHP aus können Entwickler damit auf Java-Objekte und gekapselte Enterprise Java Beans zugreifen:

$quote = new
Java("WebSphereSamples.Quote.QuoteBean");
print("$quote->quote\n");
print("$quote->author\n");

Aus der Sicht eines Unternehmens ist das interessant, weil PHP auf die Webentwicklung fokussiert ist und dafür alle benötigten Funktionen bietet, aber vorhandene Komponenten einfach einbinden kann. Zusammen mit der schnellen Erlernbarkeit, der weiten Verbreitung, der Plattformunabhängigkeit, der Performance und der Tatsache, dass PHP Open Source ist, macht dies die Sprache zu einer starken Middleware-Lösung, auch für große Unternehmen.

Fazit: PHP 4.0 ist mehr als ein einfaches Update - es ist eine komplette Neuentwicklung der Sprache und bleibt trotzdem rückwärtskompatibel. Damit ist es für die aktuellen Markterfordernisse bestens gerüstet, nur wenige Wünsche bleiben offen. Wer schon heute mit PHP 3.0 entwickelt, sollte jetzt auf 4.0 umsteigen. Wer die Sprache nur vom Hörensagen kennt, für den ist das Erscheinen der neuen Version eine gute Gelegenheit, sich näher mit ihr zu beschäftigen - es kann sich bezahlt machen.

Tobias Ratschiller
ist Berater für Neue Medien mit dem Spezialgebiet Umsetzung dynamischer Websites. Zurzeit schreibt er zusammen mit Till Gerken das Buch ‘Web Application Development With PHP’, das bei New Riders erscheinen wird. Seine Website ist www.phpwizard.net.

[1] Niels Pollem; Webprogrammierung; One size fits all: PHP: eingebettete Skriptsprache für das WWW

Mehr Infos

iX-TRACT

  • PHP ist eine in HTML eingebettete Skriptsprache, die serverseitig verarbeitet wird.
  • Version 4.0 enthält einen neuen Parser, eine Schnittstelle zu Webservern sowie eine Fülle an neuen Funktionen.
  • Zu den erweiterten Bereichen gehört neben dem Session-Management die Objektorientierung, darunter die Unterstützung von COM.
  • Mit PHP 4.0 können Webentwickler auch komplexe Anwendungen ohne die bisherigen Leistungseinbußen erzeugen.