Geschichte Das World Wide Web steckt voller Dynamik. Dabei interessiert es den Surfer nicht, wie die Seiten generiert werden. Der Webautor dagegen muss sich entscheiden, ob er mit einfachem CGI, Perl, PHP, ASP oder Java arbeiten will. Nachdem das Web seinen Anfang als verteiltes Hypertext-System genommen hat, ist schon seit langem der Trend offensichtlich, es als Plattform zur Applikationsentwicklung zu nutzen. Die eigentlichen Hypertext-Aspekte treten (bedauerlicherweise) immer mehr in den Hintergrund, und einer der wichtigsten Aspekte von Webtechniken ist heute ihre Integrationsfähigkeit in bestehende IT-Lösungen und -Infrastrukturen. Dieser Artikel stellt die populärsten Ansätze zur Anbindung von Applikationen an Webserver vor. Immer mehr verdrängen dynamische Webinhalte die statischen Dokumente. Die beiden Hauptgründe dafür sind die Reaktion auf sich verändernde Inhalte sowie auf unterschiedliche Anforderungen seitens der Inhaltskonsumenten, sei es aufgrund von Benutzerprofilen oder browserspezifischen Anpassungen. Die einfachste und älteste Möglichkeit, dynamische Webseiten zu generieren, bietet das Common Gateway Interface (CGI). CGI ist eine standardisierte Schnittstelle dafür, wie Webserver und externe Programme, die dynamische Inhalte generieren, miteinander kommunizieren. Der Vorteil dieser Lösung ist die komplette Unabhängigkeit von der Programmiersprache, denn jede Sprache, die Zugriff auf die Umgebungsvariablen des Systems bietet und das Lesen von der Standardeingabe sowie das Schreiben auf die Standardausgabe unterstützt, ist für CGI geeignet. Zudem unterstützen alle Webserver CGI. Für eine schnelle und komfortable Programmentwicklung setzten Webmaster anfangs vor allem Script-Sprachen ein, die bereits zur Automatisierung von Systemadministrationsaufgaben unter Unix verwendet wurden, beispielsweise Shell-Scripts, Perl oder Tcl. Da Webseiten jedoch typischerweise sowohl aus dynamischen, als auch zu einem großen Teil aus statischen Inhalten bestehen, hat die Verwendung von CGI-Scripts zur dynamischen Seitengenerierung einen inhärenten Nachteil: Das Script muss jeweils den ganzen HTML-Quellcode ausgeben, unabhängig davon, ob dieser dynamisch ist oder nicht. Eine elegantere Lösung wäre die Integration der Scripts in den HTML-Quellcode, sodass die dynamischen Elemente in den statischen HTML-Quellcode eingebettet werden und eine Interpretation auf dem Webserver auslösen, bevor er die Seite an den Browser sendet. Verschiedene konkurrierende Ansätze basieren auf der direkten Einbettung des ausführbaren Script-Codes in HTML. Beispiele sind Microsofts Active Server Pages (ASP), PHP, Embperl oder Java Server Pages (JSP), wobei jeder Ansatz seine spezifischen Stärken und Schwächen hat. Geschichte von Perl Programmiersprachen gibt es schon seit mehreren Jahrzehnten. Perl, das in der Mitte der 50er Jahre herauskam, ist unter den bekanntesten Programmiersprachen wahrscheinlich die Jüngste. Der Erfinder von Perl war ein Systemprogrammierer, namens Larry Wall, der eine ganze Menge an Aufgaben in der Systemverwaltung zu erledigen hatte und dem dafür aber keine geeignete Programmiersprache zur Verfügung stand. Seine Firma verfügte über zwei Gruppen von Workstations, jeweils eine an der West-und eine an der Ostküste. Diese Workstations waren durch eine langsame Modemleitung miteinander verbunden. Der Netzmanager wollte nun diese beiden Gruppen von einer zentralen Stelle aus verwalten. Prinzipiell entsprang Perl also einer Notwendigkeit. Larry Wall benötigte eine Sprache, die ein Paket Textdateien öffnen und lesen konnte, um dann neue Dateien zu erzeugen, die Berichte über die Originaldateien darstellen. Sicher hätte er auch C benutzen können, die seinerzeit bekannteste Sprache, aber C tut sich im Umgang mit Texten schwer. So erschuf Larry Wall also die erste Version von Perl. Der Name kommt von Practical Extraction And Report Language. Nach dem Larry Wall die Firma verlassen hatte, stellte er seine neugeschaffene Sprache kostenfrei ins Internet und bekam positive Rückmeldungen, Verbesserungsvorschläge und weitere Wünsche. Bald war Perl zu dem geworden, was es heute ist. Geschichte von PHP PHP hat in den letzten Jahren einen langen Weg hinter sich, und zu einer der bekanntesten Sprachen für das Web zu werden, war keine einfache Aufgabe. Wenn Sie daran interessiert sind kurz zu sehen, wie PHP zu dem gewachsen ist was es heute ist, dann lesen Sie weiter. Die Geschichte von PHP PHP/FI PHP ist der Nachfolger eines älteren Produktes, PHP/FI. PHP/FI wurde 1995 von Rasmus Lerdorf geschaffen. Ursprünglich war PHP/FI ein Set von Perl Skripten zur Erfassung der Zugriffe auf seinen Webauftritt. Er nannte dieses Set von Skripten 'Personal Home Page Tools'. Als dann mehr Funktionalität benötigt wurde, schrieb Rasmus eine viel größere Umsetzung in C, welche auch mit Datenbanken kommunizieren konnte, und den Benutzern die Entwicklung einfacher dynamischer Webapplikationen ermöglichte. Rasmus entschloss sich, den Sourcecode von PHP/FI zu veröffentlichen, sodass ihn jeder benutzen, von Fehlern bereinigen, und weiterentwicklen konnte. PHP/FI stand für Personal Home Page / Forms Interpreter, und beinhaltete manches an Funktionalität des PHP wie wir es heute kennen. Es besaß Variablen wie in Perl, eine automatische Interpretation von Formularvariablen und eine in HTML eingebettete Syntax. Die Syntax selbst war der von Perl ähnlich, wenn auch viel eingeschränkter, einfach, und ziemlich inkonsistent. 1997 war PHP/FI 2.0, die zweite Überarbeitung der C Implementierung, Kult für einige tausend Benutzer weltweit (geschätzt). Etwa 50.000 Domains berichteten PHP/FI 2.0 installiert zu haben, was mit ca. 1% der Domains im Internet zu Buche schlug. Obwohl manche Leute diesem Projekt ein Stück Code beisteuerten, war es insgesamt immer noch ein Ein-Mann-Projekt. PHP/FI 2.0 wurde im November 1997 offiziell freigegeben, nachdem es die meiste Zeit seines Lebenszyklus als verschiedene Betaversionen verbracht hatte. Es wurde kurz danach von den ersten Alphaversionen von PHP 3 abgelöst. PHP 3 PHP 3.0 war die erste Version, die dem heutigen PHP sehr gleicht. Es wurde 1997 von Andi Gutmans und Zeev Suraski neu geschrieben, nachdem PHP/FI 2.0 ihrer Meinung nach für die Entwicklung ihrer eCommerce Applikation viel zu schwach war. Auf die Basis der bestehenden Benutzer von PHP/FI aufbauend, entschieden sich Andi, Rasmus und Zeev zur Kooperation, und kündigten PHP 3.0 als den offiziellen Nachfolger von PHP/FI 2.0 an, und die Entwicklung von PHP/FI 2.0 wurde größtenteils eingestellt. Eine der größten Stärken von PHP 3.0 waren die starken Erweiterungsmöglichkeiten. Zusätzlich zu der soliden Infrastruktur für eine Menge an Datenbanken, Protokollen und APIs, lockten vor allem die Erweiterungsmöglichkeiten von PHP 3 dutzende von Entwicklern an, welche sich beteiligten, und neue Erweiterungsmodule einbrachten. Möglicherweise war das der Schlüssel zu dem gewaltigen Erfolg von PHP 3.0. Weitere besondere Merkmale von PHP 3.0 waren die Unterstützung für objektorientierte Syntax und die viel bessere sowie konsistentere Sprachsyntax. Die gesamte neue Sprache wurde unter einem neuen Namen veröffentlicht, welche die im Namen PHP/FI 2.0 vorhandene Implizierung einer eingeschränkten persönlichen Nutzung beseitigte. Es wurde einfach 'PHP' genannt, ein rekursives Akronym für PHP: Hypertext Preprocessor. Gegen Ende 1998 wuchs PHP auf eine installierte Basis von (geschätzten) zehntausenden Benutzern und hunderttausenden Websites, auf denen PHP installiert war, heran. An seinem Höhepunkt war PHP 3.0 auf etwa 10% der Webserver im Internet installiert. PHP 3.0 wurde im Juni 1998 nach einer neunmonatigen öffentlichen Testphase offiziell freigegeben. PHP 4 Im Winter 1998, kurz nach der offiziellen Freigabe von PHP 3.0, begannen Andi Gutmans und Zeev Suraski den Kern von PHP umzuschreiben. Die Ziele waren eine verbesserte Leistung von komplexen Applikationen, und eine verbesserte Modularität des Basiscodes. Solche Applikationen wurden durch die neuen Leistungsmerkmale von PHP 3.0, der Unterstützung einer großen Auswahl von Datenbanken und APIs von Drittanbietern möglich gemacht, aber PHP 3.0 war nicht dafür entworfen, solche komplexen Applikationen auch effizient zu handhaben. Die neue Engine, tituliert als 'Zend Engine' (aus den Vornamen Zeev und Andi gebildet), entsprach diesen Zielen im Design erfolgreich, und wurde zum ersten Mal Mitte 1999 eingeführt. PHP 4.0, das auf dieser Engine, verbunden mit einer großen Auswahl an zusätzlichen Leistungsmerkmalen basiert, wurde im Mai 2000 offiziell freigegeben, fast zwei Jahre nach seinem Vorgänger PHP 3.0. Zusätzlich zu der stark verbesserten Leistung, inkludierte PHP 4.0 andere wichtige Leistungsmerkmale, wie Unterstützung für viele weitere Webserver, HTTP-Sessions, Ausgabepufferung, sicherere Wege im Umgang mit Benutzereingaben, und verschiedene neue Sprachkonstrukte. PHP 4 ist die derzeit aktuellste freigegebene Version von PHP. Die Arbeit an der Modifikation und Verbesserung der Zend Engine zur Integration der neuen für PHP 5.0 entworfenen Leistungsmerkmale hat bereits begonnen. Heute wird PHP von (schätzungsweise) hunderttausenden Entwicklern verwendet, und es wird von mehreren Millionen Sites berichtet, auf welchen PHP installiert ist, was mit über 20% der Domains im Internet zu Buche schlägt. Das Entwicklerteam von PHP umfasst dutzende Entwickler, sowie dutzende andere, welche an PHP verwandten Projekten wie PEAR oder dem Dokumentationsprojekt arbeiten. Perl Wenn von Perl gesprochen wird muss auch das CGI behandelt werden. CGI-Classic CGI verdankt seine große Popularität dem einfachen Interface und der praktisch lückenlosen Unterstützung seitens der Webserver. Der Zugriff auf dynamisch generierte Inhalte erfolgt für den Benutzer transparent, das heißt, den dynamisch generierten Inhalt referenziert wie üblich eine URL, die sich nach außen nicht von einem Verweis auf statischen Inhalt unterscheidet. Der Begriff ‘Inhalt’ sei hier speziell betont, denn obwohl CGI-Scripts meistens HTML generieren, sind auch beliebige andere Inhalte möglich und werden zum Beispiel im Falle dynamischer Grafikgenerierung - wie bei Zugriffszählern - auch häufig verwendet. Bei CGI-Scripts spielen FORM-Elemente in HTML-Seiten oft eine wichtige Rolle. Sie erlauben es, einen Satz von Eingabedaten an das Script zu übermitteln. Der Abruf einer mittels CGI-Script generierten Webseite funktioniert wie folgt: Der Webserver erhält eine für das CGI-Script bestimmte Anfrage und startet darauf das CGI-Script als separaten Prozess. Den Namen des auszuführenden Scripts entnimmt der Webserver dem HTTP-Request. Den Request des Browsers, zusätzliche HTTP-Header sowie weitere serverabhängige Variablen übergibt er dem CGI-Script über dessen Standardeingabe und Umgebungsvariablen. Via Webserver kommuniziert das Script mit dem Browser, indem es die für den Browser bestimmten Ausgaben auf die Standardausgabe schreibt. Das Terminieren des Scripts schließt den Response ab. Sicherlich liegt der große Vorteil von CGI in der Einfachheit des Mechanismus und in der Generalität des Ansatzes. Das einfache Interface ist jedoch gleichzeitig die Schwäche von CGI. Viele Konzepte, die für größere Webapplikationen, etwa im E-Commerce Umfeld, nötig sind, fehlen - beispielsweise die Unterstützung von Sessions. Zudem ist die Erstellung von einem eigenen Prozess pro Request zwar eine einfach zu implementierende, jedoch keine besonders performante Lösung. CGI-Classic mit Perl Seit Beginn des Einsatzes von CGI-Scripts werden CGI und Perl oft in einem Atemzug genannt, obwohl beide keinen direkten Zusammenhang haben. Perl ist eine objektorientierte Programmiersprache, die auf den ersten Blick an Shell-Scripts oder C-Programme erinnert. Doch sie ist weit mehr: Entstanden als Practical Extraction and Report Language (PERL), eine Art integrierte Sprache für die Unix-Tools sed, awk und grep, hat sich Perl zu einer voll ausgereiften Programmiersprache entwickelt, die auf große Beliebtheit stößt, nicht zuletzt, weil sie als Open-Source-Projekt jedem kostenlos unter der ‘Artistic License’ zur Verfügung steht. Zudem gibt es Portierungen für nahezu jede Plattform. Perl zeichnet sich durch leistungsfähige Funktionen zur Textmanipulation aus, wie Suchen und Ersetzen oder die Unterstützung von Regular Expressions, was in CGI-Scripts von großem Nutzen ist. Gilt es, in einer Anwendung - wie dies bei CGI-Scripts üblich ist - andere Programme aufzurufen, deren Ausgaben zu interpretieren und neu zu formatieren, dann ist Perl sicher die erste Wahl. Ein weiterer Vorzug liegt in der ausdrucksstarken Syntax und den leistungsfähigen Befehlen, die es erlauben, kurze Programme mit großem Funktionsspektrum zu schreiben. Perls Fähigkeiten lassen sich durch in Perl oder C geschriebene Module erweitern. Über die Jahre ist eine unüberblickbare Vielzahl von PerlModulen entstanden, die ein zentrales Repository, genannt CPAN (Comprehensive Perl Archive Network), verwaltet. Für Webapplikationen gibt es auf diverse Anwendungsszenarien zugeschnittene Module, zum Beispiel Datenbankzugriff, LDAP, Mail, SMTP oder dynamische Grafikgenerierung. Beim CGI-Einsatz erfreut sich das Modul CGI.pm grosser Beliebtheit. Es erleichtert die Erstellung von CGI-Scripts erheblich durch den einfachen Zugriff auf HTML-FormularVariablen, HTTP-Header, die automatische Konversion von URL-kodierten Strings und die Unterstützung von Cookies. Zudem gibt es Perl-Wrapper für diverse HTML-Konstrukte, um die dynamische HTML-Generierung zu erleichtern. Zweifelsohne ist Perl eine leistungsfähige und interessante Programmiersprache für Webanwendungen. Da sie jedoch meist nicht in den Webserver integriert ist, sondern jeweils als eigener Prozess gestartet wird, bringt dies die bekannten Nachteile von klassischen CGIScripts mit sich, das heißt den Overhead, verursacht durch das Erzeugen eines neuen Prozesses und die fehlende Trennung zwischen dynamischem und statischem Inhalt. PHP: Hypertext Preprocessor PHP ist eine speziell auf Webapplikationen ausgerichtete Script-Sprache. Syntaktisch macht sie starke Anleihen bei Perl und C, was Umsteigern die Einarbeitung erleichtert. Sie ist Open Source, liegt in der GPL-Lizenz vor und lässt sich als Modul in Apache integrieren, was Vorteile hinsichtlich der Performance bringt. Von Anfang an speziell für das Server Side Scripting für Webapplikationen entworfen, vereint PHP Elemente von Perl und diversen Bibliotheken für netzbasierte Dienste. Während die meisten anderen Sprachen auf externe Module oder Libraries zurückgreifen, werden diese in PHP direkt integriert. Unter PHP stehen die üblichen Konstrukte aus C zur Verfügung: for(), if(), while() und so weiter. Einen Teil der Syntax borgt sich PHP von Perl. Zusätzlich zu ein- und mehrdimensionalen Arrays stehen assoziative Arrays - auch als Hash-Tabellen bekannt sowie Perl-kompatible Regular Expressions zur Verfügung. Zudem finden sich einfache objektorientierte Ansätze (stark erweitert in PHP4). Die wahre Stärke dieser Script-Sprache liegt aber in der Integration von spezifischen Funktionen, wie sie üblicherweise für die dynamische Generierung von Webseiten benutzt werden. Dazu gehören unter anderem die Generierung von GIF-Grafiken sowie die dynamische Erstellung von PDF-Dokumenten. Natürlich stellt PHP auch Methoden zur Behandlung von HTTP-Headern, zur Verwaltung von Benutzer-Sessions und zum Kodieren beziehungsweise Dekodieren von URL-encoded Strings bereit. Durch die komfortable Anbindung an diverse Datenbanken wie Oracle, MySQL, Microsoft SQL Server, Postgres oder über die ODBC-Schnittstelle (Open Database Connectivity) eignet sich die Sprache ideal für datenbankgenerierte Webseiten. Ein weiterer Vorzug sind die Schnittstellen zu verschiedenen, netzwerkbasierten Diensten, wie sie für typische Webapplikationen häufig verwendet werden, zum Beispiel POP, IMAP, SMTP oder LDAP. Die Integration eines XML-Parsers ermöglicht die Erstellung von XML-fähigen Applikationen, die zur Zeit zunehmend an Bedeutung gewinnen. Gegenüber Perl zeichnet sich PHP vor allem darin aus, dass die wesentlichen für typische Webapplikationen benötigten Funktionen direkt integriert sind und nicht als externe Module dazugeladen werden müssen. Obwohl die Sprache stark an Perl angelehnt ist, stellt sie nur eine Untermenge von deren Möglichkeiten zur Verfügung. Trotzdem eignet sie sich auch für größere Applikationen, was man an ihrer weiten Verbreitung erkennt - auch in komplexeren Anwendungen. Hier sei nochmals explizit auf die neue Release PHP4 verwiesen, die viele der bekannten Schwachstellen der Version 3 beseitigt. Beispielsweise gibt es jetzt eine integrierte Session-Unterstützung. ASP: Microsoft Active Server Pages Microsofts Lösung zum Server Side Scripting heißt ASP. Die Unterstützung für Active Server Pages ist direkt im Microsoft Internet Information Server (IIS ab Version 3) und in den Personal-Webservern von Windows 95 beziehungsweise NT integriert und deshalb einfach benutzbar. Als Programmiersprache für ASP dienen wahlweise JScript (Microsofts Implementierung von ECMAScript), VBScript (Visual Basic Script) oder eine beliebige andere Script-Sprache. Die Verwendung von JScript vereinfacht dem Entwickler die Einarbeitung, da dieselbe Sprache bereits zum Client Side Scripting in HTML zum Einsatz kommt. Der Funktionsumfang von JScript ist jedoch relativ gering gehalten, die Sprache eignet sich nur beschränkt für größere Webanwendungen. ASP-Scripts lassen sich über die Markierung mit den Tags <% ...script.... %> an beliebiger Stelle direkt in HTML einbetten. Im Gegensatz zu gewöhnlichen JScriptScripts im HTML-Source, die der Browser interpretiert, führt der Webserver den Code von ASP-Scripts direkt aus. ASP basiert auf einem ‘Objektmodell’, das heißt, die eigentliche Stärke von ASP liegt nicht in den Fähigkeiten der verwendeten Script-Sprache, sondern im Einsatz von Softwarekomponenten (COM-Komponenten), mit denen der Webprogrammierer komplexere Funktionen im Baukastenprinzip zusammensetzen kann. Prinzipiell hat er auch die Möglichkeit, eigene Scripting-fähige COM-Komponenten zu schreiben und in seinen ASPScripts zu nutzen. Typischerweise wird er aber eher auf ein Repertoire vorgefertigter Komponenten von Microsoft oder anderen Anbietern zurückgreifen. Einige Objekte sind bereits fest eingebaut. Diese erlauben klassische CGI-Funktionen, zum Beispiel Verarbeitung von HTML-Formularen, Verwaltung von Cookies und Generieren von Antwortseiten. Zudem stehen weiter gehende Funktionen zur Session-Verwaltung zur Verfügung. In einer Microsoft-Umgebung bietet sich die Verwendung von ASP an, da sich viele MSProdukte durch mitgelieferte Komponenten gut integrieren lassen und der Webserver beispielsweise auf diese Weise Excel-Tabellen einfach darstellen kann. Zur Anbindung von Datenbanken dient eine ODBC-Komponente. Abschließende Betrachtungen Welche der Lösungen die geeignetste für die Erstellung von Webapplikationen ist, hängt stark von der Ausgangssituation und der Art der Zielanwendung ab. Obwohl die hier vorgestellten Sprachen hinsichtlich der einfacheren Funktionen große Gemeinsamkeiten aufweisen, unterscheiden sie sich grundlegend in ihrer Eignung für anspruchsvolle Webapplikationen. Für weniger komplexe Programme ist zumeist ein einfacher Zugriff auf die über HTML-Formulare übertragenen Parameter interessant. Da dynamische Inhalte meist durch Abfrage einer externen Datenquelle (oft eine Datenbank) generiert werden, sind einfache Anbindungen der Script-Sprache an diese Datenquellen wünschenswert. Besonders häufig wird der Wunsch nach eine Anbindung an Datenbanken, LDAPAdressverzeichnisse oder E-Mail laut. Diese Funktionen können entweder in der Sprache selbst integriert sein (wie bei PHP), oder Zusatzmodule bieten sie (Perl, ASP, Servlets). Größere Applikationen, vornehmlich im E-Commerce-Bereich, führen den Benutzer über mehrere Webseiten, auf denen er zum Beispiel verschiedene Artikel aussuchen sowie in seinen Warenkorb legen und schließlich eine Bestellung abschicken kann. Dazu ist dem Benutzer eine so genannte Session zugeordnet, das heißt, der Webserver speichert alle Aktionen des Benutzers zwischen. Üblicherweise geschieht die Identifikation eines Benutzers zur Verfolgung einer Session über Cookies oder über URL-Rewriting. Die zur Session gehörigen Daten speichert der Webserver dazu temporär in einer Datenbank. Bei komplexeren Applikationen ist es wünschenswert, den Programmierer von der Aufgabe des expliziten Sicherns und Wiederherstellen der Session-Daten zu entbinden und ihm die Illusion von persistenten Daten innerhalb einer Session zu geben. Im Weiteren sind Funktionen erwünscht, welche die Existenz mehrerer paralleler Sessions verbergen, sodass der Programmierer die Applikation so erstellen kann, als wäre nur jeweils ein einziger Client aktiv. Hier unterscheiden sich die einzelnen Server-Side-Techniken deutlich. Während bei CGI mit Perl oder PHP3 diese Funktionen nur mit größerem Aufwand erreichbar sind, bringen PHP4, ASP und Servlets diese Fähigkeiten von Haus aus mit. Vor allem PHP4 und Servlets bieten in dieser Hinsicht leistungsfähige Funktionen. Fazit Die vorgestellten Server-Side-Techniken stellen weder eine komplette Liste an verfügbaren Lösungen dar, noch kann der Artikel eine abschließende Bewertung leisten, die sie in einer eindeutigen Reihenfolge anordnet. Anliegen ist es vielmehr, einen Überblick über die derzeit verbreitetsten Ansätze zu geben und damit bei der Frage als Entscheidungshilfe zu dienen, welche Technik für eine spezifische Aufgabenstellung am geeignetsten ist. Um eine dem Einzelfall angepasste Untersuchung kommt man jedoch nicht herum, und wie in vielen anderen Bereichen des Webs bietet sich das Vorgehen an, nicht bei Null anzufangen, sondern gründlich zu schauen, wo das gegebene Problem so oder in ähnlicher Form schon aufgetaucht ist, und was man aus den dort gewählten Lösungen lernen kann.