Dynamische Websites mit Linux

26.10.2000 von Oliver Müller
Professionelle Websites für die breite Masse leben vom schnellen Aktualisieren von Information. Eine Seite, die immer gleiche Inhalte liefert, verliert bald ihre Besucher und geht in den digitalen Weiten des Internets unter.

Das Internet ist quasi per definitionem dynamisch. Ständig kommen neue Inhalte hinzu oder bestehende verändern sich. Dem gegenüber steht das Konzept statischer HTML-Seiten, die per Hyperlink fest miteinander verdrahtet sind. Je mehr Seiten auf der Website abgelegt sind, desto größer wird der Verwaltungsaufwand.

Besonders schwierig wird es bei dynamischen Daten wie etwa Preisen oder Aktienkursen. Hier händisch HTML-Seiten zu warten ist eine undankbare Sisyphus-Arbeit und Änderungen am Design sind nur mit großem Aufwand zu realisieren. Kompliziert wird es, sobald mehrere Leute an einem Dokument arbeiten müssen - etwa um eine aktuelle News auf die Homepage zu bringen. Langsame Reaktionszeiten und Überschneidungen in der Bearbeitung (zwei Personen platzieren zur gleichen Zeit Informationen im gleichen Dokument) sind hier vorprogrammiert.

Eine Möglichkeit, diesem Problem zu entgehen, sind dynamische Webseiten auf der Basis von Script-Sprachen wie Perl, PHP oder ASP/JSP. Lesen Sie im Folgenden, wie der Aufbau dynamischer Webseiten unter Linux mit Apache, PHP und MySQL als Datenbank funktioniert.

So funktionieren dynamische Webseiten

Um die Probleme mit dynamischen Inhalten zu lösen, wurden pfiffige Techniken zum dynamischen Erzeugen von Webseiten erdacht. Microsofts Active Server Pages (ASP) und JavaSofts respektive Suns Java Server Pages (JSP) sind Beispiele hierfür. Aber auch im Open-Source-Sektor hat sich eine bekannte und mittlerweile aus dem WWW nicht mehr wegzudenkende Lösung entwickelt. Personal Home Page, kurz PHP genannt, bietet ähnlich wie ASP und JSP die Möglichkeit einer in HTML eingebetteten Script-Sprache.

Das Funktionsprinzip dynamischer Seiten ist recht simpel: Statt eine statische HTML-Seite an den Browser zu schicken, wird auf dem Server gemäß den Anweisungen im Script der HTML-Code dynamisch erzeugt und an den Browser geschickt. Der Nutzer bemerkt dabei keinen Unterschied - höchstens, dass das Laden der Seite unter Umständen etwas länger dauert. Mit anderen Worten: Die Scripts von PHP (und ASP sowie JSP) werden auf dem Server ausgeführt - im Gegensatz zu anderen HTML-embedded Scripts wie VBScript oder JavaScript, die der Browser des Clients selbst ausführt.

Meistens findet man im Schlepptau von dynamischen Webseiten auch eine Datenbank, aus der das Script die Daten holt. Datenbanken sind Multi-User-fähig und somit entstehen auch bei gleichzeitiger Bearbeitung der Inhalte keine Probleme. Bei Linux ist MySQL weit verbreitet, da es kostenfrei zu haben ist und eine ausreichende Performance bietet. Häufig sieht man daher für dynamische Webseiten eine Lösung aus Linux, Apache, MySQL und PHP, kurz Lamp genannt.

Was braucht man für PHP?

Damit Sie PHP auf Ihrem Linux-Server einsetzen können, benötigen Sie zunächst einmal einen Webserver. Im Normalfall ist dies Apache. In den Webserver müssen Sie dann PHP einbauen. In früheren Apache-Versionen musste hierfür PHP in den Quelltextbaum integriert und Apache anschließend neu kompiliert werden. Dieses Übel gehört seit Apache 1.3 der Vergangenheit an. Inzwischen genügt es, das entsprechende PHP-Modul dynamisch in den Webserver zu laden.

Als Informationsquelle für den Webinhalt verwenden Sie eine Datenbank. Hierzu müssen Sie ein Datenbanksystem installieren, mit dem PHP zusammenarbeiten kann. Glücklicherweise unterstützt PHP ein breites Spektrum von Datenbanksystemen.

Das seit Mai 2000 verfügbare PHP4 funktioniert mit mSQL, MySQL, PostgreSQL, Oracle oci8, Adabas-D, InterBase, IBM DB2, Solid Server, Empress und Ingres II. Außerdem können über benutzerdefiniertes ODBC und unixODBC weitere Treiber für andere Datenbanken - wie beispielsweise Sybase SQL Anywhere - integriert werden.

Die folgenden Beispiele beziehen sich auf die "Webdatenbank" MySQL. Außerdem ist MySQL fester Bestandteil einer Reihe von Linux-Distributionen. Red Hat Linux 7 und SuSE Linux 7.0 enthalten MySQL beispielsweise per Standard, so dass Sie hier nur die entsprechenden Pakete installieren müssen.

PHP4 konfigurieren

Die neueste Version von PHP finden Sie auf der PHP-Website. Hier laden Sie das entsprechende Archiv (auch als Tarball bezeichnet) herunter, beispielsweise php-4.0.3pl1.tar.gz. Anschließend entpacken Sie das Archiv durch folgendes Kommando:

tar xzf php-4.0.3pl1.tar.gz

Dabei wird automatisch das Verzeichnis php-4.0.3pl1 erzeugt, in das Sie mit cd php-4.0.3pl1 wechseln.

Wenn Sie eine neuere Version des PHP-Archivs laden, beachten Sie bitte, dass sich die Versionsnummer sowohl im Archivnamen als auch im Verzeichnisnamen ändert. Passen Sie also die Kommandos dementsprechend an.

Nun können Sie zur Konfiguration von PHP4 schreiten:

./configure \\
--with-apxs=`which apxs` \\
--with-mysql \\
--with-config-file-path=/etc/httpd/conf

Durch die Option with-apxs geben Sie an, dass PHP4 als ein nachladbares Modul für Apache erzeugt werden soll.

Der Schalter with-mysql legt fest, dass MySQL als Datenbank verwendet werden soll. Die Tabelle am Ende des Artikels zeigt Ihnen, welche anderen Datenbanken Sie einbinden können. Sollte Ihr Datenbanksystem in einem anderen Verzeichnis als dem Defaultpfad installiert sein oder sollten die Binaries der Datenbank nicht über die Umgebungsvariable $PATH erreichbar sein, können Sie den Pfad außerdem bei der Option angeben, zum Beispiel --with-mysql=/opt/mysql.

Durch den Switch with-config-file-path geben Sie den Pfad an, in dem die Apache-Konfigurationsdateien zu finden sind. Der Defaultpfad für Apache ist /usr/local/apache/conf. Unter Red Hat ist dies /etc/httpd/conf. Bei SuSE finden Sie die Konfigurationsdateien unter /etc/httpd.

PHP4 kompilieren

Nachdem die Konfiguration abgeschlossen ist, kann PHP4 kompiliert und installiert werden:

make && make install

Das Installationsprogramm konfiguriert die Datei httpd.conf von Apache automatisch so, dass das PHP4-Modul beim Start des Webservers geladen wird. Damit Apache das Modul auch finden kann, kopieren Sie die Shared-Library libphp4.so ins modules-Verzeichnis Ihrer Apache-Konfiguration:

cp modules/libphp4.so /etc/httpd/modules

Passen Sie den Pfad /etc/httpd/modules entsprechend Ihrer Apache-Konfiguration an.

Tragen Sie in die Apache-Konfiguration jetzt noch einen MIME-Typ für PHP4 ein, damit Apache auch weiß, welche Dateien mit PHP ausgeführt werden. Fügen Sie hierzu die Zeile

AddType application/x-httpd-php .php

in die Datei httpd.conf oder srm.conf ein.

Zu guter Letzt führen Sie noch ldconfig aus und starten Ihren Apache-Server über das entsprechende Initscript neu. Für Red Hat und kompatible Systeme verwenden Sie hierzu den Befehl

/etc/rc.d/init.d/httpd restart

Unter SuSE führt die Eingabe von

/sbin/init.d/httpd restart

zum Erfolg.

Der erste Test

Nachdem jetzt Apache inklusive PHP4 läuft kann der erste Test erfolgen. Hierzu können Sie beispielsweise folgendes HTML-Dokument mit eingebettetem PHP4 verwenden:

<HTML>
<HEAD>
<TITLE>Hallo Welt! mit PHP</TITLE>


</HEAD>
<BODY bgcolor=#eeffff>
<?
function hex($a) {
$digits[0] ="a";
$digits[1] ="b";
$digits[2] ="c";
$digits[3] ="d";
$digits[4] ="e";
$digits[5] ="f";
$x1 = $a % 16;
$x2 = ($a - $x1) / 16;
if($x1 > 9)
$d1 = $digits[$x1-10];
else
$d1 = $x1;
if($x2 > 9)
$d2 = $digits[$x2-10];
else
$d2 = $x2;
return "$d2$d1";
}

$x = 100;
while($x < 255) {
echo "<P><FONT COLOR=#";
echo hex($x), hex($x), hex($x) ,">";
?>
Hallo Welt! Hallo Welt! Hallo Welt! Hallo Welt!
Hallo Welt! Hallo Welt! Hallo Welt! Hallo Welt!
Hallo Welt! Hallo Welt! Hallo Welt! Hallo Welt!
<?
echo "</FONT></P>";
$x = $x + 10;
}
?>
</BODY>
</HTML>

Dieses PHP/HTML-Dokument erzeugt dynamisch Farbwerte für den "Hallo Welt!"-Text. Das Ergebnis sehen Sie in Grafik 1. Dieses Dokument speichern Sie einfach als hallowelt.php im HTML-Wurzelverzeichnis Ihres Apache-Servers. Danach rufen Sie es in Ihrem Browser über die URL http://localhost/hallowelt.php auf. Live können Sie sich das Script auch hier anschauen.

Die Funktion von hallowelt.php

Der eigentliche PHP-Code wird in normale HTML-Seiten in die Tags <? und ?> eingebettet. Diese Code-Schnipsel werden vom PHP-Modul in Apache ausgewertet. Befindet sich hierbei - wie in hallowelt.php - der HTML-Code in einer Schleife (while-statement) von PHP, wird dieser ebenfalls mit wiederholt.

Die Programmierung an sich erinnert stark an Perl. Das erste Snipplet beginnt mit der Definition einer Funktion, die einen dezimalen Wert in einen hexadezimalen verwandelt, wie er beispielsweise vom FONT-Tag benötigt wird. Anschließend folgt der erste Teil der while-Schleife. Diese erzeugt über den Befehl echo dynamische FONT-Tags. Hier wird bei jedem Durchlauf der Schleife die Textfarbe von dunkelgrau bis weiß variiert. Der Farbwert wird durch die Funktion hex() für den FONT-Tag erzeugt.

Der Befehl echo wirkt ähnlich wie der gleichnamige Shell-Befehl. Sie können über echo gültige HTML-Anweisungen oder auch Text innerhalb eines HTML-Tags ausgeben. Die Ausgabe erfolgt jedoch nicht auf dem Server, sondern wird an den Client geschickt.

Nach den echo-Anweisungen wird die Schleife durch das PHP-Ende-Tag ?> unterbrochen. Das erste PHP-Snipplet enthält also keine komplette - durch } abgeschlossene - Schleife. Stattdessen folgt jetzt erst einmal reguläres HTML in Form der "Hallo Welt!"-Texte. Danach kommt wieder ein PHP-Snipplet, das die Schleife abschließt. Der Clou an dieser Geschichte ist, dass der HTML-Code in Form der "Hallo Welt!"-Angaben fester Bestandteil der PHP-while-Schleife ist. Mit anderen Worten: Dieser HTML-Text wird bei jedem Schleifendurchlauf auch wiederholt an den Browser geschickt.

Datenbankzugriff

"Hallo Welt!" - schön und gut, aber letztlich ist das Ziel ja eine datenbankgestützte Website. Der Zugriff auf eine Datenbank ist recht einfach - bis auf einen kleinen Wermutstropfen. Die Datenbankanbindung ist leider nicht - wie beispielsweise bei JSP via JDBC - einheitlich geregelt. Für jedes unterstützte Datenbanksystem steht eine eigene API zur Verfügung. Das kann den Entwickler wirklich Nerven kosten, sollte es einmal daran gehen, auf ein anderes Datenbanksystem umzustellen. Sieht man von diesem Punkt ab, ist der Datenbankzugriff wirklich kein Hexenwerk.

Feld

SQL-Typ

Auch hierzu ein kleines Beispiel. Auf dem MySQL-Server muss eine Datenbank newsdb existieren, die Artikel für ein Nachrichtensystem in der Tabelle news bereithält. Diese Tabelle hat das folgende Format:

Datum

date

URL

char(50)

Dachzeile

char(20)

Titel

varchar(40)

Einleitung

varchar(255)

Das PHP-Script soll daraus eine Tabelle mit den einzelnen Artikeln generieren. Hierbei soll der Titel als Link dargestellt werden, der auf die in der Datenbank erfasste URL verweist.

News aus der Dose

Die geforderten Eigenschaften für den Newsserver erreichen Sie mit folgendem kleinen PHP/HTML-Script.

<HTML>
<HEAD><TITLE>Unsere News (PHP-Demo mit MySQL)</TITLE>

</HEAD>
<BODY>

<TABLE BORDER>
<?
$host ="meinHost.meineDomain";
$user ="DBUser";
$passwd ="DBPasswort";
$db ="newsDB";

$cnt = mysql_connect($host, $user, $passwd);
$rslt = mysql_db_query($db, "select * from news;");
$row = mysql_fetch_row($rslt);
while($row != false) {
?>
<TR><TD><H4>
<?
echo $row[2];
?>
</H4><H2><A HREF="
<?
echo $row[1];
?>
">
<?
echo $row[3];
?>
</A></H2><P>
<?
echo $row[0], ": ", $row[4];
?>
</P></TD></TR>
<?
$row = mysql_fetch_row($rslt);
}
?>
</TABLE>

</BODY>
</HTML>

Die Funktion von news.php

Der Aufruf von mysql_connect() mit dem Hostnamen, dem User und dem Passwort stellt eine Verbindung zum auf dem betreffenden Host laufenden MySQL-Server her. Anschließend wird über mysql_db_query() eine MySQL-Abfrage gestartet. Hierzu müssen an die betreffende Funktion der Name der Datenbank (hier durch die Variable $db dargestellt) und der Query-String selbst übergeben werden. Das Ergebnis wird intern im PHP4-Modul durch einen Integer-Wert dargestellt, der durch die Funktion mysql_db_query() zurückgegeben wird. Für den Zugriff auf die Ergebnisse muss dieser Wert gespeichert werden (hier in $rslt).

Die einzelnen Datensätze der Ergebnisliste werden durch die Funktion mysql_fetch_row() ausgelesen. Diese Funktion gibt jeweils den nächsten Datensatz als Array zurück und erwartet als Argument die Nummer der Ergebnisliste ($rslt). Liegt kein weiterer Datensatz mehr vor, wird false zurückgeliefert und die Schleife beendet.

Jetzt folgt wieder eine Schleife, die in mehreren Snipplets organisiert ist. Die HTML-Tags werden hierbei direkt als HTML codiert und nicht etwa per PHP-echo geliefert (was auch eine Möglichkeit wäre). Die einzelnen Werte der Datenbankfelder werden durch Zugriff auf das von mysql_fetch_row() zurückgegebene Array ausgelesen. Das Einfügen des Hyperlinks wird durch den Befehl <? echo $row[1] ?> zwischen die Anführungszeichen von <A HREF="..."> realisiert.

tecChannel.de und PHP

Wie Sie sicher schon bemerkt haben, arbeitet auch tecChannel.de mit dynamischen Inhalten. Allerdings haben wir uns aus Performance-Gründen entschieden, nur einen Teil des Angebots dynamisch zu halten - nämlich nur jenen, bei dem es wirklich Sinn macht.

Das betrifft beispielsweise die Tabellen, die Sie in unseren Vergleichstests finden - so etwa bei den CD-RW-Brennern. Ein zentrales PHP-Script namens show.php3 sorgt für die Ausgabe der in einer MySQL-Datenbank gespeicherten Datensätze. Struktur und Gestalt der Tabelle werden dabei auch über Datenbankeinträge gesteuert, weil verschiedene Produktkategorien auch verschiedene Inhalte haben. Eine Aufstellung der getesteten CD-RW-Brenner enthält nun einmal andere Daten als eine Aufstellung der getesteten Freemail-Dienste. Features wie auf- oder absteigende Sortierung nach Spalteninhalt oder eine Gesamtwertung nach benutzerdefinierter Gewichtung wären ohne ein Script überhaupt nicht möglich. Es sei denn, wir würden unsere Webmaster dazu verdonnern, jede Tabelle in x verschiedenen Varianten zu erstellen und zu pflegen. Spätestens bei einem Update des Tests - etwa weil eine neue Produktgeneration auf den Markt gekommen ist - wären die Webmaster nur noch mit Aktualisierungen beschäftigt.

Die Homepage dagegen wird teildynamisch erzeugt. Weil sie sich nur ändert, wenn eine neue News oder ein neuer Artikel online gehen, wäre eine auf PHP basierende Lösung reine Verschwendung von Ressourcen. Aus diesem Grund erzeugt unser Content-Management-System erst eine neue statische Hauptseite, wenn eine neue News vorhanden ist.

Fazit

Die Programmierung von PHP4 kann noch so einfach sein - ohne Dokumentation hat selbst der beste Programmierer schlechte Karten. Zu PHP4 finden Sie ein brauchbares Manual auf der PHP-Website oder auf dem deutschen Mirror. Klicken Sie auf dieser Site auf den Link Documentation. Dort finden Sie das Manual in verschiedenen Formaten und Verweise auf eine Vielzahl von Seiten, die sich mit der Programmierung unter PHP beschäftigen sowie Beispielscripte zum Download.

Dynamische Webseiten sind nicht nur einfach zu programmieren, sie bieten dem Internetbenutzer auch mehr Funktionalität. Generell gilt jedoch für die Programmierung dynamischer Websites der Grundsatz: So statisch wie möglich und so dynamisch wie nötig.

Anders ausgedrückt: Die Ausführung von Scripts auf dem Server kostet mehr Rechenzeit als die Auslieferung eines fertigen HTML-Dokuments. Daher sollten Sie Inhalte, die sich nur selten ändern, auch weiterhin als statisches HTML-Dokument ablegen. Nur in Bereichen mit ständiger Veränderung lohnt sich der Einsatz von serverbasierten Scripts wirklich. (mha)

Anhang: Datenbanken für PHP

Je nachdem, welches Datenbanksystem Sie verwenden, benötigen Sie eine der folgenden Optionen, um PHP richtig zu kompilieren.

Optionen für Datenbanken

Option

Datenbank

--with-msql

mSQL

--with-mysql

MySQL

--with-pqsql

PostgreSQL

--with-oci8

Oracle oci8

--with-ibm-db2

IBM DB2

--with-adabas

ADABAS-D

--with-interbase

InterBase

--with-sybase

Sybase

--with-ingres

Ingres II

--with-solid

Solid Server

--with-empress

Empress

--with-unixODBC

Datenbank per unixODBC einbinden (Pfad angeben)

--with-iODBC

Datenbank per iODBC einbinden (Pfad angeben)

--with-odbc

benutzerdefnierter ODBC-Treiber (Pfad angeben)