Laut Behme [1] ist das Gespann aus Apache-Webserver unter Linux und Microsoft SQL Server unter Windows innerhalb eines heterogenen Netzwerks das performanteste System für eine Webanwendung.
Zugegeben, der zitierte Artikel [1] hat schon einige Jahre auf dem Buckel und man kann sich lange darüber streiten, ob die Methodik die richtige war und ob Microsoft überhaupt an einem solchen Test teilnehmen darf oder vielleicht sogar die Redaktion der zugehörigen Zeitschrift gekauft hat. Deswegen die wichtige Vorwarnung: Nur, wer Religion mit Kirche und nicht mit Technologie assoziiert, wird in diesem Artikel verwertbare Informationen finden. Es wird nicht darum gehen, eine Bewertung des Microsoft SQL Servers vorzunehmen oder das Produkt gar gegen MySQL, PostgreSQL oder SQLite abzuwägen - das sollen andere machen, egal ob religiös oder nicht. Nein, stattdessen soll es darum gehen, im Rahmen der Artikelserie x ohne x zu zeigen, dass man für das Ansteuern des Microsoft SQL Servers gar nicht mal so tief in die Tasche greifen muss. Unter Umständen geht es sogar mir sehr wenig Windows im Hintergrund, im heterogenen Netzwerk (eine Ausprägung des technologischen Atheismus).
Zwei Thesen: Es funktioniert ohne den (recht kostspieligen) Microsoft SQL Server, und es funktioniert auch mit etwas weniger Windows als üblich. Zur ersten These: Microsoft bietet außerdem SQL Server (kurz: MSSQL) auch noch die MSDE an. Das Akronym steht für Microsoft SQL Desktop Engine. Das Herz der MSDE ist dasselbe wie beim Microsoft SQL Server, es gibt also sogar binäre Datenkompatibilität. Allerdings ist die MSDE etwas eingeschränkt: Datenbanken dürfen maximal 2 Gigabyte groß werden, außerdem werden nur fünf Anweisungen gleichzeitig abgearbeitet. Oft wird falsch kolportiert, nur fünf Nutzer könnten gleichzeitig auf die MSDE zugreifen, das ist jedoch nicht richtig; stattdessen findet ein Queueing der Anfragen statt, der bei fünf Stück gleichzeitig noch annehmbar performant sein soll.
Die wohl traurigste Einschränkung der MSDE im Vergleich zum großem Bruder MSSQL: Es sind keine grafischen Werkzeuge mit dabei, man ist also auf das mitgelieferte Kommandozeilentool osql.exe von Microsoft angewiesen - oder man besorgt sich ein anderes Werkzeug, beispielsweise das unter [2] oder [3]. Microsoft stellt sogar selbst ein webbasiertes System [4] zur Verfügung, das jedoch leider nur unter ASP.NET läuft.
Größter Vorteil der MSDE: Sie kostet nichts. Unter [5] gibt es die Software gratis zum Download bereit, allerdings nur unter Windows. Nach dem Entpacken des Archivs sorgt folgende Anweisung für die Installation:
Setup SAPWD=<PasswordFürNutzerSA> SecurityMode=SQL
Die Ansteuerung von PHP aus funktioniert also sowohl mit dem Microsoft SQL Server als auch mit der Microsoft SQL Desktop Engine.
Installation
Windows-Nutzer haben mehrere Wahlmöglichkeiten, die Datenbank anzusteuern. Beispielweise ODBC (Open Database Connectivity), Zynikern zufolge eine der besten Schnittstellen, die Microsoft je veröffentlicht hat. ODBC stellt eine weitere Zwischenschicht zwischen Datenbank und Applikation, ist damit zwar schön portabel und universell, aber nicht sonderlich performant. Doch es geht auch besser: PHP unterstützt auch nativ MSSQL und liefert dazu gleich eine Erweiterung mit. Die zugehörige Datei der Windows-Binärdistribution von PHP heißt php_mssql.dll und wird wie gehabt in die php.ini eingebunden:
extension=php_mssql.dll
Diese Erweiterung greift direkt auf die Client-Bibliotheken des Microsoft SQL Servers zu. Wenn diese auf dem System nicht vorhanden sind, stellt dies kein Problem dar: PHP darf sie mit ausliefern. In PHP 5 befindet sich die Datei ntwdlib.dll direkt im PHP-Verzeichnis, bei PHP 4 finden Sie die DLL im Unterverzeichnis
dlls. Unter Umständen müssen Sie die DLL ins System-Verzeichnis von Windows (etwa
c:\windows\system32) kopieren, doch in der Regel reicht das Vorhandensein im selben Verzeichnis wie der PHP-Interpreter aus. Ein Aufruf von phpinfo() zeigt das Ergebnis - und, ob es geklappt hat.
Linux-Nutzer haben es da etwas schwieriger, doch auch das ist machbar. Zunächst einmal muss vom Webserver aus der Zugriff auf die MSSQL-Installation möglich sein, die Firewall muss also Bescheid wissen. Dann müssen Sie etwas dazuinstallieren. Der Hintergrund: Der Kern vom Microsoft SQL Server stammt ursprünglich von Sybase. Diese Firma hat seinerzeit ein Protokoll entwickelt, das immer noch zur Ansteuerung von MSSQL über die Client-Bibliotheken verwendet wird. Es heißt TDS, Tabular DataStream.
Von TDS gibt es eine Open-Source-Implementierung mit dem bezeichnenden Namen FreeTDS, verfügbar unter [6]. Zum Redaktionsschluss war Version 0.62.4 aktuell (auch wenn die Website von 0.62.1 spricht), der Nachfolger 0.63 steht in Form eines Release Candidate vor der Tür. Die zurzeit aktuellste stabile Version installiert sich wie folgt:
tar -xzvf freetds-stable.tgz
cd freetds-0.62.4
./configure --prefix=/usr/local/freetds --with-tdsver=8.0
make
make install
Im Schalter --with-tdsver gibt die verwendete Versionsnummer des TDS-Protokolls an. Alte MSSQL-Versionen bis 6.5 verwenden die Protokollversion 4.2, die zurzeit noch aktuelle Version Microsoft SQL Server 2000 (beziehungsweise MSDE 2000) unterstützt zusätzlich die neuen Features von Protokollversion 8.0. Aufgrund der Abwärtskompatibilität genügt Version 4.2, doch 8.0 ist in FreeTDS schon ziemlich gut implementiert.
Ist FreeTDS erst einmal installiert, müssen Sie nur noch PHP Bescheid sagen, dass das Sybase-Protokoll unterstützt werden muss. Sinnigerweise heißt der Schalter auch --with-sybase und erhält als Wert den FreeTDS-Ordner:
./configure --with-sybase=/usr/local/freetds
make
make install
Das war es auch fast schon. Sie können nun noch in der Datei /usr/local/freetds/etc/freetds.conf einen Eintrag hinzufügen:
[MSSQLServer]
host=10.20.30.40 #entsprechende IP-Adresse angeben
port=1433
client charset=UTF-8
tds version=8.2
Der Begriff in den eckigen Klammern (hier: MSSQLServer) ist dann der Name, den Sie im PHP-Code als Servernamen für die MSSQL-Installation angeben können.

Abb. 1: Die FreeTDS-Homepage

Abb. 2: FreeTDS konfiguriert sich vor der Installation einen ziemlichen Wolf

Abb. 3: Die Ausgabe von phpinfo() verrät Informationen über die MSSQL-Konfiguration
Verbinden
Als Beispielsdatenbank kommt ein Microsoft-Klassiker zum Zuge, die Northwind-Datenbank. Der Legende zufolge wurde der Dame, die damals die Datenbank erstellt hat, nur der Auftrag gegeben, eine möglichst simple, aber trotzdem gute Demodatenbank zu erstellen, die für ein paar Monate benutzt werden sollte. Auch heute noch ist die Datenbank gang und gäbe. Wenn sie nicht auf dem lokalen System vorhanden sein sollte, kann sie unter [7] heruntergeladen und dann installiert werden.
Wichtig für den Test ist, dass der Benutzer, über den Sie sich von der Applikation aus verbinden, die entsprechenden Rechte für die Datenbank hat, beispielsweise mit der Stored Procedure sp_grantdbaccess, die Sie per GUI-Oberfläche oder osql.exe in MSSQL ausführen:
Dann funktioniert der Verbindungsaufbau wie bei den meisten Datenbank-Erweiterungen von PHP mit einer auf _connect() endenden Methode, in diesem Fall mssql_connect(). Die Parameter sind der Servername (oder seine IP-Adresse), der Benutzer und sein Passwort. Hier ein Beispiel:
<?php
if ($mssql = mssql_connect("localhost", "Benutzer", "Passwort")) {
echo "Verbindung hergestellt!";
mssql_close($mssql);
} else {
echo "Fehler beim Verbindungsaufbau!";
}
?>

Abb. 4: Trotz SQL Server: Das ist die MSDE unter Windows

Abb. 5: Visendo, eine der kostenlosen Benutzeroberflächen für MSSQL und MSDE

Abb. 6: Die Ausgabe des Beispiellistings

Abb. 7: Der freundliche Mann will Sie überzeugen: SQL Server 2005 Express Edition zum Gratis-Download
Abfragen
Um nun SQL-Kommandos an die Datenbank zu schicken und deren Rückgabewerte zu verarbeiten, sind die folgenden Schritte erforderlich:
- Wählen Sie mit mssql_select_db() die gewünschte Datenbank innerhalb des Datenbankservers aus.
- Senden Sie das SQL-Kommando per mssql_query() an die Datenquelle.
- Den Rückgabewert von mssql_query() können Sie per Schleife durchlaufen, dazu gibt es unter anderem die Funktionen mssql_fetch_object() (der Rückgabewert ist ein Objekt, die Spaltennamen dessen Eigenschaften), mssql_fetch_row() (der Rückgabewert ist ein Array mit numerischen Schlüsseln) und mssql_fetch_assoc() (der Rückgabewert ist ein Array, die Spaltennamen dessen Schlüsselwerte).
Es ist wichtig zu wissen, dass PHP standardmäßig die zuletzt geöffnete Verbindung zur MSSQL-Datenquelle verwendet, Sie müssen also bei mssql_query() kein Datenbank-Handle als Parameter übergeben, können das aber natürlich tun. Der Code zur Ausgabe aller Daten der Customers-Tabelle ist also wie folgt strukturiert:
<?php
$mssql = mssql_connect("localhost", "Benutzer", "Passwort");
mssql_select_db("Northwind", $mssql);
if ($ergebnis = mssql_query("SELECT * FROM Customers", $mssql)) {
while ($zeile = mssql_fetch_row($ergebnis)) {
// Daten ausgeben
}
}
mssql_close($mssql);
?>
Die MSSQL-Erweiterung bietet noch zahlreiche weitere Hilfsfunktionen:
- mssql_num_rows() liefert die Anzahl Spalten in einer Ergebnisliste.
- mssql_num_fields() liefert die Anzahl Spalten in einer Ergebnisliste.
- mssql_field_name() ermittelt den Namen eines Feldes; alternativ liefert mssql_fetch_field() (mit besserer FreeTDS-Unterstützung) Informationen über ein Feld, in Form eines Objekts mit praktischen Eigenschaften wie etwa name oder type.
Die folgende Schleife ermittelt also die relevanten Informationen für eine Ergebnisliste:
for ($i = 0; $i < mssql_num_fields($ergebnis); $i++) {
$infos = mssql_fetch_field($ergebnis, $i);
// Jetzt z.B. $infos->name und $infos->type ausgeben
}
Listing 1 fasst alle Möglichkeiten in ein längeres Listing zusammen: Die Tabelle Customers wird ausgegeben.Dabei werden dynamisch alle Spaltennamen mit ermittelt und angezeigt. Weiterführende Informationen zur MSSQL-Erweiterung von PHP bietet das Handbuch unter [8].
Listing 1 <!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>PHP & MSSQL</title>
</head>
<body>
<?php
$mssql = mssql_connect('localhost', 'Benutzer', 'Passwort');
mssql_select_db('Northwind', $mssql);
if ($ergebnis = mssql_query('SELECT * FROM Customers', $mssql)) {
printf('<h1>Tabelle Customers (%d Einträge)</h1>',
mssql_num_rows($ergebnis)
);
echo '<table><tr>';
for ($i = 0; $i < mssql_num_fields($ergebnis); $i++) {
$infos = mssql_fetch_field($ergebnis, $i);
printf('<th>%s (%s)</th>',
htmlspecialchars($infos->name),
htmlspecialchars($infos->type)
);
}
echo '</tr>';
while ($zeile = mssql_fetch_row($ergebnis)) {
echo '<tr>';
for ($i = 0; $i < mssql_num_fields($ergebnis); $i++) {
echo '<td>' . htmlentities($zeile[$i]) . '</td>';
}
echo '</tr>';
}
echo '</table>';
}
mssql_close($mssql);
?>
</body>
</html>
Microsoft SQL Server 2005
Nach langen Jahren der Lethargie steht endlich eine Nachfolgeversion des Microsoft SQL Servers in den Startlöchern, der Microsoft SQL Server 2005: Der Name deutet es bereits an: Die Software soll noch dieses Jahr erscheinen. Eine erste Beta-Version gibt es bereits für MSDN-Abonnenten [9] sowie zahlreiche Infos auf der Microsoft-Website [10]. Zu den zahlreichen neuen Features [11] zählen:
- Eine Möglichkeit, eine Datenbanksicherung im laufenden Betrieb einzuspielen (Online Restore).
- Die Integration von .NET-Programmierung in die Datenbank.
- Neue native XML-Datentypen.
- Die Unterstützung von Web Services.
- Volltextsuche.
Ob das Anwender anderer Datenbanksysteme zum Umstieg motivieren will, ist nicht sicher; bisherige MSSQL-Anhänger jedoch freuen sich sicherlich über das Update.
Express
Auch für die MSDE gibt es einen 2005er Nachfolger: Die Microsoft SQL Server 2005 Express Edition. Auch dabei handelt es sich um ein Datenbanksystem, das binäre Datenkompatibilität zum großen Bruder, hier MSSQL 2005, verspricht, dafür aber kostenfrei sein wird. Außerdem soll das nicht gerade für den Mehrbenutzerbetrieb ausgelegte, aber leider dennoch weit verbreitete Microsoft Access langsam aber sicher abgelöst werden. Dazu arbeitet die Express Edition von MSSQL 2005 auf Dateibasis, es muss also kein Server angegeben werden, sondern lediglich der Name der Datenbankdatei, die dann on demand im Server gehostet wird. Das vereinfacht natürlich das Deployment und zielt eher auf kleinere und mittlere Websites.
Die Beta-Version von MSSQL 2005 Express ist auch ohne MSDN-Abonnement kostenfrei erhältlich [12]; doch leider gibt es sowohl hierfür als auch für die Vollversion noch keine PHP-Unterstützung. Das mag aber auch daran liegen, dass die finale Version noch einige Monate weg ist. Nebulöse Aussagen aus Redmond sprechen von der zweiten Jahreshälfte 2005, also nicht gerade eine konkrete Angabe. Es wird aber damit gerechnet, dass es wohl gegen September oder Oktober soweit sein wird.
Zugriff ohne Benutzername und Passwort
Die letzten beiden Angaben von
mssql_connect(), also Benutzername und Passwort, können innerhalb von Windows weggelassen werden, wenn das Windows-Konto, unter dem PHP beziehungsweise der Webserver läuft (beim IIS ist das
IUSR_), Zugriffsrechte auf MSSQL hat. Man spricht dann von einer vertrauten Verbindung. Allerdings erfordert das eine zusätzliche Einstellung in der
php.ini:
mssql.secure_connection=On
Welche von beiden Varianten - also eigener Datenbanknutzer oder vorhandenen Windows-Nutzer - zu wählen ist, hängt ganz von der Systemarchitektur ab; ersterer Weg ist in der Praxis allerdings häufiger.
Fazit
Es hat mal wieder geklappt: PHP hat Dinge getan, die mancher nicht für möglich gehalten hätte. Sofern ein Microsoft SQL Server oder eine MSDE im Netz brach liegt, kann sich ein Einsatz von PHP aus durchaus lohnen, auch wenn der Webserver nicht unter Windows läuft. Bis zum nächsten Mal!
Christian Wenz ist Autor, Trainer und Berater mit Schwerpunkt Webtechnologien. In seiner Serie x ohne x zeigt er regelmäßig, wie PHP ungeahnte Fähigkeiten entwickeln kann. Sein Weblog (www.hauser-wenz.de/blog/) basiert übrigens nicht auf MSSQL. Links undLiteratur