Mit Hilfe von PHP und der Gzip Kompression kann man HTML Dateien komprimieren, und somit Transfervolumen und auch Ladezeit sparen.
Damit PHP das Gzip Verfahren unterstützt muss es mit der Option
–with-zlib
installiert worden sein. Fragen Sie hierzu einfach ihren Webhoster,
oder probieren Sie es aus.
Mit Hilfe der output buffering Funktionen ob_* wird der HTML-Code
nicht direkt an Client (Browser) gesendet, sondern in einen dynamisch
mitwachsenden Puffer gehalten.
<?php
ob_start();
print "Hallo !!!";
?>
Nun zu den Client/Server Hintergründen:
Wenn der Browser (Client) eine Anfrage an den Server stellt sieht
das so aus:
GET / http/1.1\r\n
Host: www.devmag.net\r\n
\r\n\r\n
(\r\n steht hier für RETURN Zeilenwechsel)
Wenn ihr Browser nun aber gzip-Encoding (also die gzip-Kompression
unterstützt) würde er einer Anfrage diese Zeile mit Anfügen:
Accept-Encoding: gzip\r\n
Sie können das mit ihrem Browser ganz einfach testen, in dem
sie folgenden PHP-Code ausführen:
<?php
print getenv("HTTP_ACCEPT_ENCODING");
?>
Wird nun ein String mit dem Wort gzip ausgegeben versteht
ihr
Browser die komprimierten Daten.
Damit nun die HTML-Daten komprimiert werden können übergeben
wir dem vorhin erwähnten ob_start() den Parameter für
die
Funktion ob_gzhandler(). Über diesen Handler wird dann auf
den Puffer zurückgegriffen. So ist es z.B. möglich, das
Sie mehrere Puffer für verschiedene Seiten erstellen, oder
bestimmte Codeteile in einen bestimmten Puffer packen.
Das sieht dann so aus:
<?php
ob_start("ob_gzhandler");
print "Ich bin komprimiert";
?>
Ihr Browser sollte nach dem Aufruf nun ganz normal "Ich bin
komprimiert" ausgeben.
Haben sie aber einen Browser der die gzip-Komprimierung nicht
unterstützt oder "sitzen hinter" einem Proxy-Server
dürfte
keine Ausgabe zu ihnen gelangt sein.
Um nun auf diese Clients Rücksicht zu nehmen prüfen wir
vor dem
komprimieren ob in der Variable HTTP_ACCEPT_ENCODING das
bekannt gzip vorhanden ist.
Wir machen daraus eine eigene Funktion Namens my_obstart()
:
<?php
function my_obstart() {
$encode = getenv("HTTP_ACCEPT_ENCODING");
if(ereg("gzip",$encode)) {
ob_start("ob_gzhandler");
} else {
ob_start();
}
}
my_obstart(); // Führt die Funktion nun aus
print " hallo !";
print " wir sind komprimiert oder doch nicht?! ";
?>
Sie können nun diese Funktion in ein anderes File speichern
und bei bedarf per include laden
Es funktioniert auch, wenn keine print oder echo Befehle sondern
das PHP nur geschlossen wird z.b.
<?php
include("myobstart.php");
my_obstart();
?>
<HTML>
<TITLE>TESTPAGE</TITLE>
<body>
TEST TEST TEST
</body>
</html>
<? // hier können wieder PHP Befehle stehen
// z.b. mysql_close();
?>
Es gibt ein Script zum Download,
das nach dem selben Prinzip funktioniert, aber zusätzlich sieht
man noch wieviel komprimiert worden ist und man hat die Möglichkeit
den KompressionsLevel (0-9) einzustellen.