6 HTTP
Da das http-Protokoll naturgemäß sehr oft für die Kommunikation zwischen Client und Server benötigt wird, sind in diesem Bereich auch viele Pakete angesiedelt. Einige vereinfachen den direkten Zugriff auf Funktionalitäten des Protokolls, so dass Sie nicht auf die header()-Funktion von PHP zurückgreifen müssen. Andere stellen nur ein objektorientiertes Interface für PHP-interne Funktionen zur Verfügung.
Das http-Protokoll ist ein »Klartext-Protokoll«. Die Informationen und Befehle werden also nicht verschlüsselt übertragen. Das hat den Vorteil, dass Sie als Entwickler mit einem Packet-Sniffer wie z. B. Ethereal [Ethereal ist unter http://www.ethereal.com erhältlich. ] oder mit einem Telnet-Programm, das Sie mit Port 80 des Servers verbinden, recht einfach mitlesen können, welche Daten ausgetauscht werden. Für eine Erläuterung der Befehle ist es am sinnvollsten, RFC 2616 zu lesen. [RFC 2616 finden Sie z. B. unter http://www.faqs.org/rfcs/rfc2616.html. ]
Zum Austausch von Status-Informationen werden innerhalb des Protokolls verschiedene Status-Codes genutzt. Die wichtigsten Codes finden Sie in Tabelle 6.1. Eine Liste der wichtigsten Codes mit einer ausführlichen Erläuterung der Bedeutung finden Sie im RFC.
Wie Ihnen in Tabelle 6.1 vielleicht aufgefallen ist, beginnen unterschiedliche »Code-Klassen« jeweils mit einer anderen Zahl. Codes, die mit einer 1 beginnen, werden als »Informational« bezeichnet. Sie dienen einfach nur der Information des Clients, ziehen aber keine weitergehende Aktion nach sich. Die 2XX-Codes bestätigen einen erfolgreichen Zugriff des Clients. Ein Code, der mit einer 3 anfängt, teilt dem Client mit, dass er weitergeleitet wird. Die 4XX- und 5XX-Codes sagen aus, dass ein Fehler aufgetreten ist. Die 4er-Klasse sind Fehler, die vom Client ausgehen, und bei den 5XX-Codes handelt es sich um serverseitige Fehler.
Bevor Daten zu einem Client übertragen werden, bekommt der Client die Information, um welche Art von Datei es sich handelt und wie diese Datei zu handhaben ist. Dies wird dem Empfänger mithilfe des MIME-Types mitgeteilt. Da MIME-Types nicht in Form von Konstanten oder Variablen definiert sind, müssen Sie sie von Hand eingeben. Ein MIME-Type setzt sich immer aus einem Content-Type und einem Subtype zusammen. Der Content-Type einer HTML-Datei ist text, da es sich um eine reine Text-Datei handelt. Ein MS-Word-Dokument gehört hingegen zum Content-Type application, da es nicht vom Browser, sondern mit einem externen Programm geöffnet wird. Innerhalb des Content-Types wird dann noch eine große Anzahl von Untertypen unterschieden. Im Fall einer HTML-Datei ist der Untertyp html, der direkt nach text, abgetrennt durch einen Slash, anzugeben ist. Somit ergibt sich text/html und für ein Word-Dokument application/msword. Ein paar häufig benötigte MIME-Types habe ich in Tabelle 6.2 zusammengestellt. Eine komplette Liste aller Typen finden Sie bei der IANA. [http://www.iana.org/assignments/media-types/ ]
6.1 HTTP 

Besprochene Version: 1.3.5 | Lizenz: PHP-Lizenz |
Klassendatei(en): HTTP.php |
Das Paket HTTP enthält einige grundlegende Funktionalitäten für die Arbeit mit dem http-Protokoll. Alle Methoden können statisch aufgerufen werden und liefern im Falle eines Fehlers ein PEAR_Error-Objekt zurück. Die Klasse ist in der Datei HTTP.php definiert.
Eine recht hilfreiche Methode ist date(). Sie dient dazu, einen übergebenen Timestamp in ein RFC-konformes Datum umzuformatieren. Übergeben Sie keinen Timestamp, wird die aktuelle Zeit vom System übernommen.
require_once('HTTP.php'); $date=HTTP::date(); echo $date; // Ausgabe z. B.: Wed, 16 May 2001 08:00:00 GMT
Ein so formatiertes Datum ist z. B. dann hilfreich, wenn Sie einen Header zur Cache-Steuerung senden möchten.
Die Methode redirect() stellt eine einfache Möglichkeit dar, um einen Client auf eine andere Seite weiterzuleiten. Ihr wird die URL übergeben, an die der Client weitergeleitet werden soll. Hierbei ist entweder eine absolute Angabe, die mit http:// beginnt, oder eine relative Angabe möglich, die sich auf den aktuellen Server bezieht.
HTTP::redirect("http://www.netviser.de/"); // absolute Angabe HTTP::redirect("seite_zwei.php"); // relative Angabe
Die übergebene URL wird nicht auf Validität überprüft. Übergeben Sie jedoch einen Query-String, z. B. etwas wie do_insert.php?name=Möhrke, so müssen Sie sich nicht um die URL-gerechte Kodierung der enthaltenen Sonderzeichen kümmern. Das übernimmt das Paket für Sie. Die Methode akzeptiert darüber hinaus noch einen booleschen Parameter. Übergeben Sie nach der Adresse ein true, so wird direkt nach der Weiterleitung das Programm beendet. Das hat den Vorteil, dass dadurch sichergestellt wird, dass kein weiterer Code ausgeführt wird. Kann keine Weiterleitung erfolgen, weil bereits Header oder Daten an den Browser geschickt wurden, so gibt die Methode false zurück. An dieser Stelle noch ein Hinweis: Ein Redirect auf eine relative URL ist nach RFC 2616 nicht zulässig. Daher wandelt die Methode eine relative URL automatisch in eine absolute URL um.
Um einen Abgleich der Spracheinstellungen zwischen Applikation und Browser durchführen zu können, ist die Methode negotiateLanguage() vorgesehen. Die Informationen, welche Sprachen serverseitig zur Verfügung stehen, werden ihr in Form eines Arrays übergeben. Dieses Array enthält die üblichen ISO-Abkürzungen für Sprache und Sprachraum (als z. B. de-DE, en-US oder en-UK) als Schlüssel. Darüber hinaus müssen Werte vorhanden sein, die nicht als false interpretiert werden können. Hierbei kann es sich also z. B. um true, 1 oder um den Namen einer Sprachdatei handeln, die Ihre Applikation benutzt.
Die Methode vergleicht die Sprachen, die der Server und der Browser unterstützen, und liefert dann den Code der Sprache zurück, die vom Browser als am wichtigsten eingestuft und vom Server unterstützt wird.
require_once ('HTTP.php'); $sprachen = array( 'en' => 'langs/english.php', 'en-US'=> 'langs/english.php', 'en-UK'=> 'langs/english.php', 'de' => 'langs/deutsch.php', 'de-DE'=> 'langs/deutsch.php' ); // Liefert z. B. de-DE zurueck $neg = HTTP::negotiateLanguage($sprachen); // versucht, die Sprachdatei langs/deutsch.php einzubinden require_once($sprachen[$neg]);
Sollte die Methode keine Übereinstimmung ermitteln können, gibt sie en-US zurück.
Die letzte, wirklich sehr praktische Methode ist head(). Sie sendet den HEAD-Befehl an einen Server. Der HEAD-Befehl des http-Protokolls dient dazu, Meta-Informationen von einem Server abzufragen. Er sollte hierbei dieselben Informationen liefern, als würde er eine Seite per GET oder POST versenden. Die Methode liefert einen Hash zurück, in dem die Daten enthalten sind. Die Methode bekommt die URL eines Servers bzw. die URL einer Datei übergeben. Sollte diese URL ungültig sein oder nicht aufgelöst werden können, so gibt die Methode ein PEAR_Error-Objekt zurück.
require_once ('HTTP.php'); require_once ('PEAR.php'); $head=HTTP::head("http://www.netviser.org"); if (true===PEAR::isError($head)) { die ($head->getMessage()); } print_r($head);
Listing 6.1 Auslesen von Server-Informationen
Das zurückgelieferte Array enthält die in Tabelle 6.3 dargestellten Schlüssel.
Falls Sie die Methode head() nutzen, beachten Sie bitte, dass Sie das Paket PEAR manuell einbinden müssen, wenn Sie testen wollen, ob ein Fehler aufgetreten ist, da HTTP die Klasse erst dann einbindet, wenn ein Fehler auftritt.
Wie Sie sehen, ist die Klasse nicht sonderlich umfangreich, aber sie kann durchaus sehr hilfreich sein.