6.2 HTTP_Header 

Besprochene Version: 1.1.1 | Lizenz: PHP-Lizenz |
Klassendatei(en): HTTP/Header.php; HTTP/Header/Cache.php |
Mit HTTP_Header haben Sie die Möglichkeit, einen http-Header relativ elegant und umfassend zu beeinflussen. Leider verhindert auch dieses Paket nicht, dass Sie sich für etwas individuellere Bedürfnisse mit dem Aufbau des http-Protokolls auseinander setzen müssen. Des Weiteren sind einige Methoden zum Analysieren von Header-Inhalten vorgesehen, die in Kombination mit Klassen sehr hilfreich sind.
Das Paket ist in den Dateien HTTP/Header.php und HTTP/Header/Cache.php definiert und erbt die Methoden und Eigenschaften der Klasse PEAR::HTTP.
Wie auch schon im Paket HTTP ist hier eine statisch nutzbare Methode namens redirect() implementiert, die den Client weiterleitet. Um eine einfache Weiterleitung zu initiieren, ist die Methode des Pakets HTTP völlig ausreichend und sollte auch genutzt werden. Die Variante aus HTTP_Header ist allerdings noch ein wenig flexibler. Sie akzeptiert neben dem Weiterleitungsziel noch zwei weitere Parameter. Als ersten können Sie ein assoziatives Array angeben, das dann als Query-String an die Ziel-Adresse angehängt wird. Danach können Sie – wenn Sie mit einer Session arbeiten – mit einem true dafür sorgen, dass die Session-ID auch noch Teil des Query-Strings wird.
require_once('HTTP/Header.php'); session_start(); $dat = array( "name" => "Paulsen", "id" => "12" ); HTTP_Header::redirect("loeschen.php",$dat,true); //Generierte URL koennte z. B. so lauten (Session-ID gekuerzt): //loeschen.php?PHPSESSID=ece6f0e4056527da01&name=Paulsen&id=12
Um einen komplexeren Header zu senden, benötigen Sie ein HTTP_Header-Objekt, das Sie dann mit den gewünschten Werten »bestücken« und senden können.
Die http-Version kann mithilfe der Methode setHttpVersion() festgelegt werden. Sie akzeptiert entweder die Werte 1, 1.0 oder 1.1 als Parameter. Um andere Elemente des Headers beeinflussen zu können, steht die Methode setHeader() zur Verfügung. Sie bekommt typischerweise zwei Parameter übergeben. Neben dem http-Feld-Namen wird als zweiter Parameter der dazugehörige Wert übergeben. Das Caching-Verhalten mithilfe der Pragma-Direktive zu beeinflussen könnte so aussehen:
Eine besondere Stellung nimmt der Last-Modified-Header ein, mit dem einem Client mitgeteilt wird, wann das Dokument zuletzt geändert wurde. Übergeben Sie diesen Header an die Methode, können Sie den Zeitpunkt der letzten Änderung als Timestamp übergeben. Übergeben Sie keinen Wert, übernimmt die Methode den aktuellen Timestamp und gibt ihn als Datum der letzten Änderung aus. Die Methode sendHeaders() schickt den bzw. die Header zum Client. Sollte das nicht möglich sein, weil schon Header versandt wurden, gibt sie false zurück.
Zu diesen beiden set-Funktionen existieren auch Umkehrfunktionen, mit denen Sie die Versionsnummer und andere Header aus einem bestehenden Objekt auslesen können. Sie heißen getHtttpVersion()und getHeader(). Die erste bekommt keinen Wert übergeben und die zweite nur den Namen des Headers, der ausgelesen werden soll.
Um einen Status-Code an den Client zu schicken, können Sie auf die Methode sendStatusCode() zurückgreifen. Sie bekommt die Nummer des gewünschten Codes als String übergeben und schickt ihn direkt zum Client. Auch sie liefert false zurück, wenn die Header bereits verschickt wurden. Die Zeile
teilt dem Browser mit, dass die angeforderte Datei nicht gefunden werden konnte.
Um den Umgang mit Status-Codes zu vereinfachen, sieht das Paket einige Methoden vor, die zur Analyse eines solchen Codes dienen.
In diesem Zusammenhang sind auch getStatusType() und getStatusText() hilfreich. Sie liefern den Typ eines übergebenen Codes, also z. B. 3 oder 4 bzw. den Text, der den Fehler erläutert, zurück.
require_once('HTTP/Header.php'); $code="404"; $myHeader = new HTTP_Header(); if (true===$myHeader->isError($code)) { echo "Fehlerbeschreibung: "; // Gibt "File Not Found" aus echo $myHeader->getStatusText($code); echo "<br />Typ des Fehlers: "; // Gibt 4 aus echo $myHeader->getStatusType($code); }
6.2.1 Cache-Steuerung 

Es ist recht einfach, eine Anleitung zu finden, wie Sie einen Client davon abhalten, eine Datei im Cache zu halten. Allerdings ist es ein wenig aufwändiger, den Client davon abzuhalten, eine Seite erneut anzufordern, wenn er sie bereits im Cache hält. Ein erneutes Abrufen der Seite kann häufig vermieden werden, und dadurch können Rechenzeit und Traffic eingespart werden. Ein ganz einfacher Anwendungsfall könnte so aussehen:
require_once 'HTTP/Header/Cache.php'; $header = new HTTP_Header_Cache(1,'days'); $header->sendHeaders(); //Code der eigentlichen Seite
In diesem Fall wird festgelegt, dass die Datei einen Tag gültig sein soll. Der Konstruktor bekommt die Information übergeben, wie lange die Datei gecacht werden darf. Der erste Parameter definiert die Länge und der zweite die dazugehörige Zeiteinheit. Geben Sie den zweiten Wert nicht an, geht das System automatisch von Sekunden aus. Neben days (für Tage) können Sie auch weeks (Wochen), hours (Stunden) oder minutes für Minuten angeben. Der Konstruktor leistet dann auch gleich die eigentliche Arbeit. Er wertet den IF_MODIFIED_SINCE-Header aus, den er vom Client übergeben bekommt. Hiermit teilt der Client mit, ob er bereits eine Kopie dieser Datei im Cache hat bzw. wie alt diese ist. Ist die Kopie älter als die Vorgabe, die Sie definiert haben, passiert nichts weiter, und das Script wird normal ausgeführt. Ist die Kopie allerdings so neu, dass sie innerhalb des vorgegebenen Akzeptanzbereichs liegt, beendet der Konstruktor das gesamte Script und schickt den http-Code »304 – Not Modified« an den Client. Somit kann es passieren, dass der Rest Ihres Scripts nicht weiter ausgeführt wird, was Sie bei der Arbeit mit diesem Paket im Hinterkopf behalten sollten.
Ist die Kopie des Clients schon »überlagert« oder handelt es sich um eine Seite, die auf Daten basiert, die via POST übergeben wurden, so wird ein HTTP_Header_Cache-Objekt mit den übergebenen Informationen bestückt und zurückgegeben. Um die dort enthaltenen Informationen dann an den Client zu senden, ist die Methode sendHeaders() vorhanden. Danach kann dann der eigentliche Code der Seite folgen. Zwar kennt die Klasse noch mehr Methoden; da es sich hierbei aber primär um Hilfsmethoden handelt, die dazu dienen, dem Konstruktor die Arbeit zu ermöglichen, verzichte ich darauf, sie zu erläutern.