Seminar Datenbanken & WWW SS 2001 Datenbankenanbindung: CGI & PHP Universität Zürich Institut für Informatik Fachgebiet Datenbankentechnik Prof. K. R. Dittrich Autor: Marcel Schleinkofer Betreuerin: Daniela Damm Inhaltsverzeichnis Seite 2 von 13 Inhaltsverzeichnis INHALTSVERZEICHNIS 2 ZUSAMMENFASSUNG 3 1 EINLEITUNG 3 2 KONZEPTE VON DATENBANK-ANBINDUNGEN 4 2.1 2.2 2.3 3 DIE CGI- SCHNITTSTELLE 3.1 3.2 3.3 3.4 4 SCHICHTEN-ARCHITEKTUR EINGEBETTETE SKRIPTSPRACHE ODER EIGENSTÄNDIGE PROGRAMME? EIN RECHNER-PROZESS PRO ANFRAGE? CGI- DAS KONZEPT DATENBANKANBINDUNGEN MIT CGI PERSISTENTE DATENBANKVERBINDUNG CGI-AUFRUFE UND ÜBERGABE VON PARAMETERN AUS HTML DATENBANK-ANBINDUNGEN MIT PHP 4.1 4.2 4.3 4.4 ENTWICKLUNG VON PHP EIGENSCHAFTEN UND EINSATZ VON PHP DATENBANKANBINDUNGEN MIT PHP PERSISTENTE DATENBANK-VERBINDUNGEN 4 5 6 6 6 7 7 8 9 9 9 9 11 5 VERGLEICH 11 6 FAZIT 12 7 QUELLVERZEICHNIS 13 Seminar Datenbanken, SS 2001 Datenbankenanbindung mit CGI & PHP Zusammenfassung Seite 3 von 13 Zusammenfassung Die vorliegende Arbeit befasst sich mit der Frage, wie Datenbankanbindungen an das World Wide Web realisiert werden können. Dabei wird der Schwerpunkt insbesondere auf zwei der möglichen Techniken gelegt: CGI und PHP. Die Arbeit zeigt nach einer Einleitung ins Thema im zweiten Kapitel auf, welche Konzepte zur Anwendung gelangen, wenn eine Web-Applikation Zugriff auf eine Datenbank erhalten soll. Zuerst gilt es die Architektur der Applikation zu bestimmen. Die drei Funktionsbereiche Datenhaltung, Applikationslogik und BenutzerSchnittstelle können auf verschiedenen Ebene verteilt werden. Entscheidend ist jedoch auch, welche Art von Programmiersprache man verwenden will. Im dritten und vierten Kapitel werden die konkreten Ansätze von CGI’s und PHP näher beleuchtet um sie im fünften Kapitel miteinander zu vergleichen. Während CGI eine Schnittstelle für die Übergabe von Parametern an Programme in irgendeiner Programmiersprache darstellt, ist PHP ein Skriptsprache, welche in normale HTMLDokumente eingebettet wird. Im Gegensatz zu z.B. Java Script wird dieser Code jedoch serverseitig ausgeführt. Dies ermöglicht ebenso, wie bei CGI-Programmen, die Anbindung von Datenbanken. Ein direkter Vergleich der beiden Ansätze fällt nicht einfach, zumal PHP teilweise als CGI-Interpreter implementiert ist. Andererseits sind beide Konzepte mittlerweile ziemlich ausgereift, so dass anfängliche Schwächen durch neuere Lösungen aufgefangen wurden. 1 Einleitung Das World Wide Web ist in den letzten Jahren explosionsartig gewachsen. Dies sowohl in quantitativer, wie auch qualitativer Hinsicht. Einfache, statische Seiten, welche mit der Seitensprache HTML gestaltet werden, genügen den Ansprüchen der Surfergemeinde und auch der Geschäftswelt längst nicht mehr. Abhilfe schaffen mittlerweile dynamisch generierte Seiten, welche an den aktuellen Benutzer angepasst werden können. Dynamische Seiten werden bei jedem Aufruf in Abhängigkeit von verschiedenen Parametern, wie z.B. dem Usernamen oder einem Stichwort, generiert. Sie bieten damit ganz andere und mächtigere Möglichkeiten an: Bekannte Funktionalitäten wie Zugriffszähler, News-Verwaltungen, Shops oder ganze Web-Applikationen können verwirklicht werden. Hinter komplexeren Anwendungen stecken oft eine Menge von Daten, welche in einer Datenbank gespeichert werden. Dazu ist eine sogenannte Datenbankanbindung nötig, welche es ermöglicht, die Resultate von Datenbankanfragen auf eine Web-Seite zu bringen. Ebenso wie es mittlerweile verschiedenste Technologien für die Erstellung von dynamischen Seiten gibt, lassen sich ganz unterschiedliche Ansätze für die Nutzung einer Datenbank über das Web aufzählen. In dieser Arbeit sollen zwei Ansätze vorgestellt werden: Datenbankanbindungen mit CGI oder PHP. Dabei werden in einem ersten Teil die Grundkonzepte für Datenbankenanbindungen an HTML-Seiten vorgestellt. In den weiteren Kapiteln sollen die jeweiligen Ansätze von CGI und PHP erläutert werden. Dabei wird nicht vorausgesetzt, dass der Leser CGI und PHP kennt, wohl aber dass HTML und die Grundfunktionsweise eines World Wide Web nicht gänzlich unbekannt ist. Schliesslich seien, am Ende dieser Einleitung in das zu behandelnde Thema, noch zwei, drei Worte zum Autor und zur Arbeit erwähnt. Die vorliegende Arbeit wurde im Rahmen des Seminars Datenbanken im Sommersemester 2001 verfasst. Der Autor studiert im 6. Semester Wirtschaftsinformatik an der Universität Zürich und hat sich im Laufe dieser Arbeit erstmals mit den beiden Konzepten zur Datenbankanbindung befasst. Hegnau, Juni 2001 Seminar Datenbanken, SS 2001 Marcel Schleinkofer Datenbankenanbindung mit CGI & PHP Konzepte von Datenbank-Anbindungen Seite 4 von 13 2 Konzepte von Datenbank-Anbindungen Wie kann eine Web-Seite auf eine Datenbank zugreifen? Um diese Frage zu beantworten, sollen hier einige grundsätzliche Überlegungen angestellt werden. Dies vorerst unabhängig von den konkreten Lösungen, welche CGI und PHP anbieten. Das Erstellen einer Applikation, welche aus dem World Wide Web auf eine Datenbank zugreifen kann, erfordert Überlegungen in dreierlei Hinsicht, die sich auf die Architektur der Lösung auswirken. Die drei Aspekte sind in den folgenden Fragestellungen formuliert und sollen anschliessend erläutert werden: Welche Schichten-Architektur soll zur Anwendung gelangen? Soll eine eingebettete Skriptsprache verwendet werden? Soll jede Datenbank-Anfrage in einem eigenen Rechner-Prozess stattfinden? Diese drei Aspekte tangieren einander sehr stark und sollen hier nur der Übersichtlichkeit halber nacheinander behandelt werden. 2.1 Schichten-Architektur Verteilte Anwendungen mit Zugriff auf eine Datenbank, lassen sich in drei funktionale Bereiche aufteilen: Dies sind einmal die Daten, welche im Datenbank-Server gehalten werden. Auf diese muss vom Benutzer über eine Benutzer-Schnittstelle zugegriffen werden können. Heute ist dies meistens eine grafische Oberfläche. Für die Abfrage und deren Handling ist dazwischen die Applikationslogik zuständig. Diese drei funktionalen Bereiche lassen sich nun mehr oder weniger genau auftrennen. Die Abbildung 1 gibt einen Überblick über die Architekturen mit jeweils unterschiedlicher Verteilung der drei funktionalen Bereiche. 2-Tier-Architektur n-Tier-Architektur User Interface User Interface Tier 4 Tier 3 Client Web-Server Client Web(http)-Server Applikationslogik DatenbankServer Web-Server Web(http)-Server ApplicationServer Applikationslogik Tier 1 Tier 1 Tier 1 Tier 2 Tier 2 Client Tier 3 Tier 2 User Interface Applikationslogik 3-Tier-Architektur DatenbankServer DatenbankServer Abb. (1) Schichten-Architekturen im Überblick In einer Zweischichten-Architektur (2-Tier Architektur) sind die Bereiche Benutzerschnittstelle und Applikationslogik nicht getrennt, sondern alles ist in einer Schicht vereint. Diese Architektur ist für Web-Applikation, wo der Client einem Internet-Browser entspricht, nicht geeignet. Zwar liesse sich über Java-Applets eine direkte Verbindung zu einem Datenbank-Server herstellen. Voraussetzung dafür ist jedoch eine sehr gelockerte Sicherheitskonfiguration für das Applet. Dies ist neben weiteren Nachteilen dieser Architektur, der wichtigste Hinderungsgrund für die Umsetzung. Zweischichten-Architekturen werden deshalb hier auch nicht weiter behandelt. Seminar Datenbanken, SS 2001 Datenbankenanbindung mit CGI & PHP Konzepte von Datenbank-Anbindungen Seite 5 von 13 HTML-Seiten werden vom Browser, der als Client funktioniert, bei einem Web-Server angefordert. In einer Dreischichten-Architektur (3-Tier-Architektur) übernimmt der Web-Server, d.h. eigentlich zusätzliche Funktionalitäten des Web-Servers, die Applikationslogik, welche die Kommunikation mit dem Datenbank-Server übernimmt. Heute werden die drei Schichten allerdings immer häufiger durch mindestens eine weitere Schicht ergänzt, weshalb man von n-Tier-Applikationen spricht. Der Grund dafür liegt darin, dass einem Applikationsserver die gesamte Applikationslogik übergeben werden kann. Diese kann sehr umfassend sein und viel weiter gehen, als nur eine Datenbank-Abfrage realisieren. Der Applikationsserver kann z.B. die User-Verwaltung oder das LoadBalancing übernehmen. Die Trennung zwischen 3-Tier und n-Tier-Architekturen ist nicht immer ganz scharf, da es dieselben Mittel sind, mit denen in beiden Architekturen die Applikationslogik realisiert wird. Als Unterscheidungskriterium gilt jedoch, inwieweit die Applikationslogik tatsächlich vom Web-Server getrennt ist. Wenn der Applikationsserver physisch auf einer anderen Maschine läuft, ist dies darum als n-Tier Architektur einzustufen. 2.2 Eingebettete Skriptsprache oder eigenständige Programme? In einer Drei- oder Mehrschichten-Architektur ist es möglich, die Applikationslogik, welche die Kommunikation mit dem Datenbank-Server erledigt, in zwei Kategorien aufzuteilen: 2.2.1 Eingebettete Skriptsprachen Zur ersten Kategorie zählen sogenannte Skriptsprachen, welche innerhalb eines HTML-Dokumentes eingebettet werden. Dieser Code wird serverseitig ausgeführt. Der Web-Browser fordert also beim Web-Server eine spezielle Datei an. Diese Datei kann sowohl HTML-Tags enthalten, als auch Programmcode in einer Skriptsprache. Diese Teile werden von den HTML-Tags durch verschiedene öffnende und schliessende Tags abgetrennt (z.B. <? .... ?>, <% .... %>). Dateien mit eingebetteten Skripten werden dem Web-Server ebenfalls durch die Verwendung von speziellen Dateiendungen, wie ASP, JSP, PHP, usw. kenntlich gemacht. Der Server sorgt dafür, dass die Skripte durch einen Interpreter ausgeführt werden. Das Skript erfüllt irgendeine Aufgabe und generiert HTMLCode, welcher anstelle des Codes in die HTML-Datei eingebettet wird. Im Falle einer Datenbankanwendung findet hier eine Datenbankabfrage statt. Der Browser erhält in der Folge ein reines HTML-Dokument zurückgesandt. Skriptsprachen werden wie schon angedeutet, bei jeder Ausführung interpretiert. Beispiele für eingebettete Skriptsprachen sind: Java Server Pages, Active Server Pages oder PHP. Vorteilhaft bei der Entwicklung von Web-Applikation mit Hilfe von eingebetteten Skriptsprachen ist, dass sie nicht bei jeder Änderung neu kompiliert werden müssen. Dies zieht jedoch gleichzeitig einen PerformanceVerlust mit sich, da das Programm zur Laufzeit interpretiert wird. 2.2.2 Eigenständige Programme Die zweite Kategorie sind Programme, welche vom Webserver gestartet werden und in der Regel irgendwelche Aufgaben ausführen und entsprechend den Resultaten eine HTML-Seite generieren. Sie werden hier eigenständige Programme genannt, weil sie im Gegensatz zu eingebetteten Skriptsprachen unabhängig ausgeführt werden können. Diese Programme können in kompilierter Form vorliegen oder sie werden von einem Interpreter, resp. einer Virtual Machine im Falle von Servlets ausgeführt. Der Server erkennt sie durch die Kennzeichnung mit einer speziellen Dateiendung (z.B. pl für Perl-Programme), sowie der Angabe eines speziellen Verzeichnisses auf dem Server (bspw. CGI-bin). CGI-Programme, Servererweiterung oder Servlets sind Beispiele für solche Programme. CGI’s werden später noch eingehender behandelt. Hier sei deshalb erst erwähnt, dass es sich dabei um keine Programmiersprache handelt, sondern um eine Schnittstelle, welche es dem Web-Server erlaubt, mit Programmen zu kommunizieren [Gund96, S.1]. Der Browser sendet nun z.B. ein ausgefülltes Formular an den Server. Mit Hilfe des CGI kann dieser die vom Benutzer in Form des Formulars übergebenen Parameter in einer definierten Weise an ein Programm weitergegeben. Oft wird solch ein Programm als CGI-Programm bezeichnet. Diese Bezeichnung könnte zur irrtümlichen Annahme verleiten, dass CGI eine Programmiersprache sei. Wie schon erwähnt, ist dem aber nicht so. 2.2.3 2-Tier oder n-Tier-Architektur? Bei in HTML eingebetteten Skriptsprachen ist es möglich, dass der Web-Server selbst ein Modul eingebaut hat, das die Ausführung dieses Skriptes übernimmt. In diesem Fall würde es sich um eine 3-Tier-Architektur handeln. Der Web-Server kann solche Skripts jedoch auch an einen Application-Server weiterreichen, welcher es seinerseits durch einen Interpreter ausführen lässt. So gesehen handelt es sich dann um eine n-Tier-Architektur. Seminar Datenbanken, SS 2001 Datenbankenanbindung mit CGI & PHP Die CGI- Schnittstelle Seite 6 von 13 Unscharf ist die Unterscheidung auch bei eigenständigen Programmen. Eine mögliche Meinung ist die, dass z.B. ein CGI-Programm als kleinster Teil eines Application-Servers anzusehen ist. Demnach würde es sich um eine nTier-Architektur handeln [NeTh01, Folie 23]. 2.3 Ein Rechner-Prozess pro Anfrage? Der Erfolg von Web-Datenbank-Applikationen wie Online-Shops ist häufig davon abhängig, welche Anzahl von gleichzeitigen Benutzern bewältigt werden kann. Da die Applikationslogik in einer solchen Anwendung aus einem Programm besteht das für jede Datenbankoperation aktiv werden muss, ist es entscheidend, dass dies ressourcenschonend vonstatten geht. Deshalb ist es wichtig zu wissen, ob für jeden Aufruf dieses Programms ein eigener Rechner-Prozess gestartet werden muss. Alle Aufrufe in einem Server-Prozess abzuwickeln, ist dagegen schneller und speichersparender. Die Tatsache, dass bei jedem Aufruf eines CGI-Programms ein separater Prozess gestartet werden muss, kostet Ressourcen und damit auch Performance. Für stark performante Anwendungen ist dies ein Nachteil, der dazu geführt hat, dass die Entwickler von Web-Servern nach anderen Wegen gesucht haben [Loes, S.7]. Sogenannte Server-Erweiterungen umgehen nun den Prozessaufruf für jeden Start eines Programmes, indem sie ein proprietäres API (Application Programming Interface) zur Verfügung stellen. Damit kann auf eine Programmbibliothek des Servers zugegriffen werden, welche allerdings beim Start des Servers geladen werden muss. In Bezug auf Datenbankanbindungen haben diese Server-Erweiterungen den Vorteil, dass sie einmal geöffnete Datenbankverbindungen weiterverwenden können (z.B. in einem Pool von zur Verfügung stehenden Verbindungen) [Loes, S.7]. Dies stellt einen weiteren Performance-Vorteil gegenüber klassischen CGI-Programmen dar. Anderseits kann ein Absturz bei einem Aufruf einer Server-Erweiterung den gesamten Server in Mitleidenschaft ziehen, was bei CGI’s durch die Verwendung von unterschiedlichen Prozessen nicht der Fall ist. Ähnlich den ServerErweiterungen funktioniert Fast-CGI. Bei dieser Weiterentwicklung von CGI wird ein Server-externer Prozess gestartet, welcher danach allen CGI-Programmen zur Verfügung steht [roxen01]. 3 Die CGI- Schnittstelle Nachdem nun aufgezeigt wurde, welche prinzipiellen Ansätze verfolgt werden können, um eine Datenbankanbindung zu verwirklichen, soll in diesem Kapitel näher auf CGI eingegangen werden. 3.1 CGI- das Konzept Das Common Gateway Interface (CGI) stellte die erste Möglichkeit dar, dynamische generierte HTML-Seiten im World Wide Web zu publizieren [Gund96, Vorwort]. Einem Webbrowser wird es damit ermöglicht, über einen Webserver Programme ausführen zu lassen, welche z.B. Daten aus Formularen verarbeiten, Daten speichern oder aus einer Datenbank auslesen. Das auszuführende Programm liest über eine definierte Schnittstelle, eben das CGI, die Eingabedaten, verarbeitet diese und generiert dann meistens eine HTML-Seite, welche dem Web-Server zurückgeliefert wird. Dieser sendet die damit generierte Seite seinerseits an den Browser des Benutzers zurück. Allerdings ist es grundsätzlich auch möglich, andere Formate wie PDF, Postscript, reine Grafikformate u.a. zu generieren [Gross01]. Im Prinzip ist es ein einfaches Modell, das dem CGI zu Grunde liegt. Abbildung 2 zeigt dieses Modell auf. 1 Aufruf des CGI2 Programmes Request, z.B. Formular Web-Server Browser (Client) 3 CGI-Programm Antwort des CGIProgramms in Form von z.B. HTML Abb. (2) Modell eines CGI-Programmaufrufes nach [Gund96, S.2] Wie bereits angedeutet, beschreibt CGI dabei lediglich die Art der Übergabe von Eingabe-Parametern. Aus diesem Grunde können CGI-Programme in einer beliebigen Sprache geschrieben sein. Die einzige Voraussetzung, Seminar Datenbanken, SS 2001 Datenbankenanbindung mit CGI & PHP Die CGI- Schnittstelle Seite 7 von 13 welche die Sprache erfüllen muss, besteht darin, dass sie die CGI-Schnittstelle ansprechen kann [Gross01, S.4]. Etabliert hat sich als CGI-Sprache jedoch insbesondere Perl. Der Grund dafür liegt in den von Perl zur Verfügung gestellten mächtigen Funktionen für Zeichenoperationen oder das Lesen und Schreiben von Daten. 3.2 Datenbankanbindungen mit CGI Aus dem oben veranschaulichten Modell von CGI-Programmen geht auch hervor, wie mit CGI-Programmen ein Datenbankanbindung zu bewerkstelligen ist. In diesem Falle nimmt das CGI-Programm die Funktion eines Gateways ein. Da aus einer HTML-Seite nicht direkt mit einer Datenbank kommuniziert werden kann, muss die HTML-Seite eine Anforderung an ein CGI-Programm senden, welches seinerseits die Anfrage z.B. in Form einer SQL-Anweisung an die Datenbank sendet und die vom DB-Server zurückgesendete Resultatmenge auswertet und daraus ein HTML-Dokument generiert. Diesen Sachverhalt zeigt Abbildung 3 auf. „weitergereicht“ von Web-Server z.B. Formular Senden Konvertieren nach SQL Empfangen SQL-Anfrage Verarbeiten Formatierte Ergebnisse Browser HTMLDatei Konvertieren nach HTML Ergebnisse Antworten Datenbank CGI-Programm Abb. (3) Interaktion Browser- Datenbank via CGI-Programm. Nach [Gund96, S.247] Schematisch ist nun aufgezeigt, wie eine Datenbank-Verbindung mit CGI-Programmen vonstatten geht. Im konkreten Fall ist es natürlich, wie so oft in der Informatik, auch hier so, dass jeder Datenbankenhersteller ein eigenes API zur Ansteuerung der Datenbank zur Verfügung stellt. Dies ist aufwendig und nicht sehr komfortabel. Aufgrund dieser Tatsache wurde für die Programmiersprache Perl das sogenannte DBI (DataBase Interface) entwickelt, welches ein Modul zur Herstellerunabhängigen Datenbankanbindung darstellt. Die Architektur dieser Lösung sieht wie folgt aus: Das DBI abstrahiert die proprietären Hersteller-API’s und bietet die Möglichkeit SQL-Anfragen abzusetzen und die Resultatmenge verarbeiten zu können. Das DBI kommuniziert dabei nicht direkt mit der Datenbank, es verwendet dazu immer einen entsprechenden Database Driver (DBD). Diese DBD’s stellen Driver für die entsprechenden Datenbanken dar [Arkadia]. Abbildung 4 veranschaulicht diese Architektur. Abb. (4) Database Interface (DBI) und Database Driver (DBD), Quelle [Arkadia] 3.3 Persistente Datenbankverbindung In Kapitel 2 wurde festgestellt, dass CGI-Programme einen eigenen Prozess beanspruchen. Historisch gesehen stimmt dies auch. Das Starten des Perl-Interpreters als externes Programm und der Aufbau der DatenbankVerbindung sind „teure“ Operationen, die bei jedem HTTP-Request erneut ausgeführt werden. Dieser Nachteil der CGI-Schnittstelle kann mittlerweile z.B. mit dem Einsatz des Web-Servers Apache, sowie den Modulen „ModPerl“ und „Apache::DBI“ eliminiert werden. ModPerl ist ein Built-In Perl Interpreter und Apache::DBI ist das Apache-Modul von DBI. Mit ModPerl entfällt der Aufruf des externen Perl-Interpreters. Der Perl-Interpreter läuft damit in einem Prozess des Web-Servers und es ist somit unnötig bei jedem Aufruf eines Perl-Programmes einen neuen Prozess zu starten. Seminar Datenbanken, SS 2001 Datenbankenanbindung mit CGI & PHP Die CGI- Schnittstelle Seite 8 von 13 Ausser dem Geschwindigkeitsvorteil eröffnet sich mit diesem Ansatz für den Programmierer eine weitere ressourcenschonende Möglichkeit: Sogenannte persistente Datenbank Verbindungen können erstellt werden. Was ist damit gemeint? Nun, wird in einem Programm eine Datenbank-Abfrage durchgeführt, muss zuerst eine Datenbank-Verbindung eröffnet werden. Ist das Programm beendet, wird die Verbindung wieder geschlossen. Von einer persistenten Verbindung spricht man, wenn zum Einen beim Öffnen der Verbindung versucht wird, eine vom gleichen Benutzer bereits einmal benutzte Verbindung wiederzuverwenden. Zum Anderen wird die Verbindung nach Beendigung des Programmes nicht geschlossen. Sie bleibt eine gewisse Zeit bestehen für einen zukünftigen Zugriff des gleichen Benutzers. Gerade bei häufiger Interaktion ist dieses Verfahren natürlich sehr ressourcenschonend [Akad01]. 3.4 CGI-Aufrufe und Übergabe von Parametern aus HTML Es stellt sich nun die Frage, wie ein CGI-Programm aus einem HTML-Dokument heraus gestartet werden kann und wie die Schnittstelle für die Parameterübergabe konkret aussieht. CGI-Programme sind auf dem Web-Server üblicherweise in einem Verzeichnis „CGI-bin“ zu finden, welches Ausführungsrechte besitzt. Der Aufruf der Programme geschieht auf verschiedene Weise [Gross01, S.6-7]: Das Perl-Programm News.pl wird durch einen Hyperlink aufgerufen: <a href=“/cgi-bin/news.pl“>NEWS anzeigen</a> Server Side Includes: Dies sind HTML-Dateien mit den Dateiendungen .shtml oder .shtm, welche u.a. Anweisungen zur Ausführung eines CGI-Programmes enthalten. Ein Beispiel für die Verwendung von Server Side Includes ist das Einfügen des aktuellen Datums. Nicht alle Web-Server unterstützen diese Server Side Includes. Die von einem Formular abgeschickten Daten können durch ein CGI-Programm verarbeitet werden. Dafür muss ein Programm auf dem Server zu gestartet werden, das dies übernimmt. Im Form-Tag eines Formulars wird das auszuführende Programm angegeben: <form action=“cgi-bin/script.pl“> Es bleibt nun die Frage, wie Parameter von einer HTML-Seite an ein CGI-Programm übergeben werden können. Hier kommt das eigentliche CGI, also die standardisierte Schnittstelle zum Tragen. Wenn ein CGI-Programm aufgerufen wird, erhält es Zugriff auf die sogenannten Umgebungsvariablen. Da CGI aus der UNIX-Welt stammt, ist der Begriff dort entlehnt. Normalerweise werden einem Programm Parameter über die Standardeingabe übergeben. Da dies im Falle von CGI-Programmen nicht funktioniert, wird dort der Umgebungsmechanismus des Webservers verwendet. Die Parameter werden in ein Array gepackt, das als „Umgebungsvariable“ bezeichnet wird. Dabei handelt es sich grob gesagt um Informationen über den Client, den Server und den Benutzer vom Benutzer übergebene Formulardaten Auf diese Umgebungsvariablen kann aus jeder CGI-unterstützenden Programmiersprache zugegriffen werden. In Perl würde dies z.B. etwa so aussehen: $browserName = $ENV(’HTTP_USER_AGENT’); Hiermit wird der Variable browserName der Name des aufrufenden Browsers, welcher in der Umgebungsvariablen HTTP_USER_AGENT, gespeichert ist, zugewiesen. Das Lesen von Formulardaten geschieht genau gleich über das Lesen der Umgebungsvariablen QUERY_STRING oder CONTENT_LENGTH. Welche der beiden Variablen zum Einsatz gelangt, ist abhängig von der Übermittlungsart. HTML-Formulare können Daten per GET- oder POST-Methode übermitteln. Für Details hierzu sei auf die entsprechende Literatur verwiesen (z.B. [Gund96, S. 30ff]) Die Verwendung des PostVerfahrens ist etwas komplizierter, da hier über die Variable CONTENT_LENGTH nur die Länge der Angaben übermittelt werden. Seminar Datenbanken, SS 2001 Datenbankenanbindung mit CGI & PHP Datenbank-Anbindungen mit PHP Seite 9 von 13 4 Datenbank-Anbindungen mit PHP In der Architektur-Übersicht wurde festgehalten, dass es neben der direkten Verbindung zu einem DatenbankServer und der Verwendung eines Programms, das als DB-Client funktioniert, noch eine dritte Möglichkeit gibt. Anstelle eines vom HTML-Code getrennten Programms, werden häufig Skriptsprachen eingesetzt, die direkt im HTML-Code eingefügt werden. Eine der verschiedenen in diesem Bereich ist PHP. Diese Skriptsprache und deren Einsatz für Datenbankanbindungen im Web soll nun kurz besprochen werden. 4.1 Entwicklung von PHP Bei PHP handelt es sich um eine im Laufe des Jahres 1994 von Rasmus Lerdorf entwickelte serverseitig ausgeführte Skriptsprache, welche in HTML-Code eingebettet wird. Auf seiner Homepage wurde die Sprache als Personal Home Page Tools veröffentlicht. Daher stammt dies Abkürzung PHP, welche heute offiziell PHP: Hypertext Preprocessor heisst [PHPM01]. Im Rahmen eines Universitätsprojektes wurde die Sprache dann in die heutige, stark an C und Java angelehnte Form gebracht [Köhn01]. Mittlerweile ist die Sprache bei Version 4 angelangt und wird von der Open Source Gemeinde weiterentwickelt. Heute wird der PHP-Interpreter für alle gängigen Web-Server angeboten. 4.2 Eigenschaften und Einsatz von PHP Der PHP-Code wird innerhalb von normalen HTML-Dokumenten geschrieben und dort durch die Zeichen <?.....?> eingeschlossen. Für den Web-Server werden die Dateien durch die Dateiendung .php gekennzeichnet. Der Webserver lässt in so gekennzeichneten Dateien, die PHP-Teile durch einen PHP-Interpreter ausführen. Die Aufgabe des Programms ist es, HTML Code zu generieren, welcher an die Stelle des Codes im HTMLDokument eingefügt wird. Der PHP-Interpreter kann einerseits als CGI-Modul auf einem CGI-fähigen Web-Server eingesetzt werden. Diese Version bringt den bei CGI’s üblichen Nachteil mit sich: Für jedes PHP-Dokument wird ein eigener Prozess gestartet. Andrerseits kann diesen Nachteilen durch die Installation einer Server-Erweiterung entgegengewirkt werden. Diese lässt den PHP-Interpreter in einem Server-internen Prozess laufen und stellt diesen allen PHPProgrammen zur Verfügung. PHP ist sehr einfach zu erlernen und anzuwenden. Dies und vermutlich der zunehmende Einsatz von Linux als Betriebssystem, dem Apache Web-Server, MySql als Datenbank und dazu als ideale Ergänzung PHP (sog. LAMP-Konfiguration) haben in den letzten zwei, drei Jahren wohl dazu geführt, dass die PHP-Gemeinde stark wächst. Im Internet lassen sich so zum Beispiel ausgezeichnete und aktuelle Dokumentation finden. Bei CGI ist dies schon eher schwierig. Grundsätzlich lässt sich mit PHP alles machen, was auch mit CGI-Skripts möglich ist. Die Stärke von PHP liegt jedoch in der sehr umfangreichen Funktionalität und hier insbesondere in der breiten Unterstützung von Datenbanken. Von PHP4 werden die folgenden Datenbanken unterstützt: Adabas D InterBase ODBC IBM DB2 PostgreSQL Dbase FrontBase Oracle (OCI7 und OCI8) MySQL Solid Empress MSQL Informix Velocis Ingres Unix dbm Sybase FilePro (nur Lesezugriff) MS SQL Abb. (5) Von PHP4 unterstützte Datenbanken PHP bietet des weiteren gewisse Konzepte aus der objektorientierten Welt an: Klassen und Objekte stehen zur Verfügung und können auch abgeleitet werden. 4.3 Datenbankanbindungen mit PHP PHP unterstützt die verschiedenen Datenbanken, indem für die Ansteuerung jeder dieser Datenbanken entsprechende Funktionen zur Verfügung gestellt werden. Dies soll im Folgenden am Beispiel einer Verbindung zu einer MySQL-Datenbank aufgezeigt werden. Das Beispielskript fragt den Inhalt einer Tabelle ab, welche in einer Datenbank auf dem mySQL-Server liegt. Das Resultat der Abfrage wird anschliessend in einer HTML-Tabelle dargestellt. Für das Verständnis dieses PHP-Skripts ist ein minimales Wissen über SQL und HTML vorausgesetzt. Seminar Datenbanken, SS 2001 Datenbankenanbindung mit CGI & PHP Datenbank-Anbindungen mit PHP Seite 10 von 13 <html> <title>Datenbankanbindung</title> <body> Dies sind ganz normale HTML-Tags. Das einführende Tag <html> zeigt an, dass nun HTML-Tags folgen werden. Im <title> - Tag findet der Browser den Titel der Seite, welcher im Titelbalken des Fenster angezeigt wird. Nach dem öffnenden <body> - Tag folgt normalerweise der Inhalt der HTML-Seite. <?php In diesem Beispiel setzt nun hier der PHP-Code ein, was dem Web-Server durch das einleitende <?php – Tag angezeigt wird. Aller Code, der bis zum schliessenden ?> steht, wird vom PHP-Interpreter interpretiert. Als erstes soll eine Verbindung zu einer MySQL-Datenbank geöffnet werden: $db = mysql_connect("DB-Servername", "username", "password") or die ("Could not connect"); Die Funktion mysql_connect kann mit verschiedenen Parametern aufgerufen werden. Im Beispiel wird der Servername des MySQL-Servers angegeben und da der Zugriff auf den DB-Server per Benutzername und entsprechendes Passwort geschieht, werden diese angegeben. PHP kennzeichnet Variablen mit dem Dollarzeichen $. In der Variablen $db werden nun sämtliche intern gebrauchten Angaben zur Datenbank-Verbindung gespeichert. Falls die Verbindung aus irgendeinem Grund nicht gelingt, wird die Meldung „Could not connect“ ausgegeben und das Skript verlassen. mysql_select_db("DatenbankName",$db); Die zu benutzende Datenbank wird mit der mysql_select_db Funktion ausgewählt. Dabei muss die eröffnete Verbindung als Parameter mit übergeben werden. $result=mysql_query ("select * from members",$db); Nun geht es darum, eine SQL-Anweisung an den Datenbankserver zu senden. Im Beispiel werden alle Felder der Tabelle members in der gewählten Datenbank zurückgeliefert und im Array $result gespeichert. echo "<table ><tr>"; echo "<th>Vorname</th><th>Nachname</th><th>Adresse</th><th>PLZ</th><th>Ort</th>"; echo "</tr>"; Damit das Resultat der Abfrage im Browser adäquat dargestellt werden kann, wird mit den echo-Befehlen die HTML-Tags für den Kopf einer Tabelle ausgegeben. Die SQL-Abfrage ist jetzt durchgeführt und die Daten sind in der Variable $result gespeichert. Die einzelnen Datensätze müssen nun noch ausgelesen und dargestellt werden. while ($items=mysql_fetch_array($result)) Solange im Array $result noch weitere Datensätze gespeichert sind, werden diese wie folgt ausgelesen: { echo "<tr>"; echo "<td>" .$items['firstName'] ."</td>"; echo "<td>" .$items['lastName'] ."</td>"; echo "<td>" .$items['Address'] ."</td>"; echo "<td>" .$items['ZIP'] ."</td>"; echo "<td>" .$items['Location']."</td>"; echo "</tr>"; } Jedes Feld des Datensatzes wird mit der $items-Funktion ausgelesen und per echo-Befehl angezeigt. Die PunktNotation steht in PHP für das Aneinanderhängen eines Strings. echo "</table>"; Die HTML-Tabelle wird mit diesem Echo-Befehl beendet. mysql_close($db); Zum Abschluss des Skriptes wird die Verbindung mit der Datenbank geschlossen. Diese hätte im Übrigen auch vor dem Auslesen des Arrays geschlossen werden können. Seminar Datenbanken, SS 2001 Datenbankenanbindung mit CGI & PHP Vergleich Seite 11 von 13 ?> <!-- weiterer HTML-Code --> </body> Mit dem schliessenden ?> - Tag wird dem Server angezeigt, dass der PHP-Bereich beendet ist. Nun könnte noch weiterer HTML-Code angefügt werden. Das Beispiel zeigt auf, dass sich MySQL-Datenbankanbindungen mit PHP aus zwei Elementen zusammensetzen: Funktionen, welche für die eigentliche Datenbankverbindung besorgt sind: öffnen, schliessen der Verbindung, Wahl der Datenbank u.a. Funktionen zum Absetzen von SQL-Befehlen Dieses Prinzip bleibt sich für die Anbindung von anderen Datenbanken, welche SQL unterstützen, in etwa gleich. Allerdings bietet PHP für jede unterstützte Datenbank eigene und angepasste Funktionen an, welche die jeweiligen Eigenheiten berücksichtigen. Was geschieht nun beim Aufruf dieser PHP-Datei durch einen Browser? Der Webserver erkennt durch die Dateiendung .PHP, dass es sich um ein HTML-Dokument mit eingebettetem PHP-Skript handelt. Er lässt deshalb den zwischen den Tags <!PHP und ?> eingebetteten Code durch den PHP-Interpreter ausführen. Die im Skript durch die Echo-Befehle ausgegebenen HTML-Tags und Daten werden nun in die HTML-Datei eingebettet uns so an den Browser gesandt. Der folgende HTML-Code würde im Beispiel an den Browser zurückgeliefert: <html> <title>Datenbankanbindung</title> <body> <table > <tr> <th>Vorname</th><th>Nachname</th><th>Adresse</th><th>PLZ</th><th>Ort</th> </tr> <tr> <td>Hans</td><td>Muster</td><td>Musterstrasse</td><td>8000</td><td>Zuerich</td> </tr> <tr> <td><!-- weitere Datensätze -->....</td> </tr> </table> <!-- weiterer HTML-Code --> </body> Man sieht also, die von der Datenbank zurückgelieferten Informationen wurden anstelle des PHP-Skripts in den HTML-Code eingebettet. Der Browser sieht den PHP-Code dabei nie! 4.4 Persistente Datenbank-Verbindungen Mit PHP sind persistente Datenbank-Verbindungen sehr einfach zu realisieren [Merl01]. Zur Repetition: Persistente Datenbank-Verbindungen werden nach Abschluss eines Programms nicht geschlossen. Dies mit dem Ziel, dass die Verbindung für weitere Kommunikation mit dem Datenbanken-Server benutzt werden kann. Damit werden Ressourcen gespart. Der Versuch eine persistente Verbindung zu öffnen, geschieht beispielsweise für den MySql-Server einfach durch die Funktion mySQL-pConnect(„Host“,“User“,“Password“). Die einzige Änderung erfährt der Befehl durch das p, das eingefügt wird. Ansonsten bleibt sich alles gleich – auch die anderen SQL-Funktionen. 5 Vergleich Mit welcher der beiden Datenbankenanbindungsmöglichkeiten eine Web-Applikation entwickelt werden soll, hängt von einigen Faktoren ab. Die Tabelle in Abbildung 6 zeigt einige auf: Seminar Datenbanken, SS 2001 Datenbankenanbindung mit CGI & PHP Fazit Seite 12 von 13 Eigenschaft CGI-Programme PHP Erlernbarkeit CGI einfach einfach Programmiersprachen je nachdem Performance Abhängig von Implementierung: ein Prozess pro Programm ressourcenfressender als Prozess für alle Programme. Abhängig von Implementierung: ein Prozess pro Programm ressourcenfressender als Prozess für alle Programme. Abhängig von Programmiersprache: Skriptsprache langsamer als kompilierte Sprache Skriptsprache, welche zur Laufzeit interpretiert wird. Trennung Programmlogik und GUI Zum Teil. Im HTML-Teil ist das GUI angelegt und im CGIProgramm die Logik, aber auch gewissermassen der AntwortTeil des GUI’s i.d.R. nein, da PHP im HTML-Code eingebettet ist. PHP kann aber in Logik und GUI aufgeteilt werden – es besteht aber die gleiche Problematik wie bei CGI’s Datenbankanbindungen Verbindungen zu sehr vielen Datenbanken. Vorteil der Abstrahierung durch DBI Verbindungen zu sehr vielen Datenbanken. Nachteil, dass in der offiziellen Version kein DBI-ähnliches Modul besteht. Dies wurde mittlerweile allerdings bereits entwickelt Persistente Datenbankanbindungen Ja Ja Zukünftige Entwicklung und Verbreitung Vermutlich eher etwas rückläufig. Im Trend Dokumentationen Viele, aber z.T. etwas veraltet Hervorragend und aktuell Abb. (6) Vergleich von CGI-Programmen und PHP Aus der Tabelle ist ersichtlich, dass beide Konzepte in den entscheidenden Fragen sehr ähnlich liegen. Zum Teil wurden gewisse, ursprüngliche Schwächen durch Neuentwicklungen ausgemerzt, was die Entscheidung nicht einfacher macht. Schlussendlich ist es wohl die Frage, was die Applikation können muss, resp. welches dafür die geeignete Programmiersprache sein dürfte. Im Falle von umfangreichen Zeichenoperationen dürfte die Wahl daher vermutlich auf Perl fallen – und damit auf die Verwendung des CGI. Andrerseits gibt es viele einfachere Anforderungen, welche sowohl in irgendeiner CGI-Programmiersprache, als auch in PHP problemlos gemeistert werden können. Da ist die Entscheidung wohl zu einem grossen Teil eine Frage der persönlichen Sympathie. 6 Fazit Ein direkter Vergleich von CGI-Programmen und PHP-Skripten ist schwierig zu ziehen, zumal viele PHPInterpreter als CGI’s entwickelt wurden. Der grösste Unterschied ist jedoch darin zu sehen, dass PHP eine in HTML Code eingebettete Sprache darstellt. Dies hat den Vorteil, dass der Entwickler den Code nicht bei jeder Änderung neu kompilieren muss. Allerdings ist auch dieses Argument nicht ganz durchgängig, da es auch CGI-Sprachen gibt, welche interpretiert werden (z.B. Perl). Die saubere Trennung von GUI-Code, der bei Web-Applikationen vom Web-Designer geschrieben wird und der Business-Logik, welche vom Programmierer beherrscht werden muss, ist bei beiden Ansätzen schwierig realisierbar. PHP bietet hier vermutlich jedoch die besseren Möglichkeiten, da insbesondere zurückgelieferte Daten vom Programmierer in Variablen bereitgestellt werden können, die der Designer nur noch einzusetzen braucht. In Bezug auf Datenbankanbindungen lassen sich keine direkten Schlüsse ziehen, da PHP und CGI’s insgesamt etwa gleichwertige Lösungen anbieten – mindestens für einfachere Anwendungen. Geht es um extrem performante Lösungen, ist kompilierbaren Programmiersprachen, also CGI’s, der Vorzug zu geben. Exakte Performance-Vergleichsdaten konnten jedoch nirgends gefunden werden, so dass dies auch nur eine theoretische Überlegung darstellt. Für viele Anwendungen wird die Entscheidung deswegen eher einer persönlichen Sympathiekundgebung entsprechen. In meinem Falle würde ich, falls nicht durch die obengenannten Fakten beeinflusst, eindeutig PHP wählen. Ich könnte mir vorstellen, dass die zunehmende Verbreitung von Linux-Servern, in dessen Umfeld PHP vorwiegend eingesetzt wird (sog. LAMP Konfiguration bestehend aus Linux, Apache Web-Server, MySql und PHP), die Verbreitung und Entwicklung im PHP-Bereich verstärken könnte. Seminar Datenbanken, SS 2001 Datenbankenanbindung mit CGI & PHP Quellverzeichnis Seite 13 von 13 7 Quellverzeichnis Die Quellangaben erfolgen unter Angabe von: Autor; Titel, Band; Verlag; Erscheinungsort; Erscheinungsjahr, [Datum der Abfrage]. Falls Angaben fehlen, werden anstelle der obigen Angaben die folgenden Abkürzung benutzt: o. A; o.T.; o. V.; o. O; o. J. Im Falle von Dokumenten, welche im Internet publiziert wurden, wird als Erscheinungsort die Internetadresse angegeben und sofern publiziert, der Ort der Abfassung. Als Ersatz für den Verlag wird die Institution angegeben, unter deren Namen das Dokument publiziert ist. Das Erscheinungsjahr ist hierbei oft nicht angegeben, weshalb das Datum der letzten Änderung der Seite angegeben wird und zusätzlich das Datum der Abfrage. Literatur [Gund96] Shishir Gundavaram; CGI Programmierung im World Wide Web, 2. Auflage; O’Reilly/International Thomson Verlag GmbH Co KG; Bonn; 1996 [Loes] Henrik Loeser; Technik für Web-basierte Datenbankanwendungen: Anforderungen, Ansätze, Architekturen; Universität Kaiserslautern; o. J. Elektronisch abrufbare Dokumente [Akad01] o.A. ; Information Technology, Datenbankapplikationen mit Perl, DBI , Oracle 8i; Arkadia AG; http://www.akadia.com/dbi/soug/html/main.html, Bern; o. J, Stand 16.6.01 [Gross01] Grossmann Alex; Datenbankanbindung an das WWW: CGI-Common Gateway Interface; Universität Zürich; http://www.ifi.unizh.ch/dbtg/Classes/376SS2001/Ausarbeitungen/cgi.PDF; 2001, 29.6.01 [Köhn01] Köhntopp Kristian; Data Driven Web Sites mit PHP Teil 1; o.V. ; http://www.koehntopp.de/kris/artikel/data-driven/; 2000, 16.6.01 [Merl01] Merl Edgar, PHP vertiefen; Fernuniversität Hagen; http://www.stud.fernunihagen.de/q4181824/php-db.html; 2001, 16.6.01 [NeTh01] Neumann Thomas, Thorn Matthias; Application Servers; Systor; http://www.systor.com/know/campus/lecture/unizh/ifi_enabl_sw_archit_ec/docs/thema_appl_ser ver_EJB.pdf; 2000, 29.6.01 [PHPM01] Diverse Autoren; PHP-Manual; The PHP-Group; http://www.php.net/manual/de/; 2001, 16.6.01 [roxen01] o.V.; o. T. ; Roxen Platform http://www.dimi.uniud.it/labs/documentazione/roxen/parsed/Challenger1.2/Administrator/scripti ng/fastcgi.html; o. J., 19.6.01 Weitere Links zum Thema Dynamische Webseiten-Generierung und Erklärung der Datenbankanbindung; PHP-Center: http://www.php-center.de/tutorial/teil4.htm Perl-Ressourcen: http://www.perl.com/pub PHP-Einführung: http://www.pl-berichte.de/work/php/print/phpws_1.html Datenbankanbindungen für dynamische Web-Seiten; http://www.torsten-horn.de/techdocs/db-web.htm Kleines Web-Datenbank-Kompendium; http://www.simsy.ch/intranet/db.htm PHP3 – Ein Überblick: http://www-cgi.uni-regensburg.de/WWW_Server/Dokumentation/PHP/Einfuehrung/ Seminar Datenbanken, SS 2001 Datenbankenanbindung mit CGI & PHP