Sie sind hier : sebastian1012.bplaced.net/ homepage-neu / kreuz-und-quer / tutorials-info-neuigkeiten-php / datenstrom-komprimieren.php

Datenstrom komprimieren

Wir versuchen oft an den Performance-Schrauben im PHP-Script zu drehen, trotzdem wird das Laden der Seite bei den Besuchern dadurch irgendwann nicht mehr beschleunigt, wenn man die gröbsten Performance-Schnitzer ausgemerzt hat. Man kommt schnell zu dem Schluss, dass da nix mehr zu machen sei, weil der Client einfach eine zu langsame Internetverbindung hat.

Gut, mittlerweile haben viele Leute DSL und schnellere Internetverbindungen und trotzdem surfen noch eine Menge anderer Leute mit einem 56k Modem. Selbst schuld? Diesem Motto sollte man sich nicht anschließen, denn in keinem anderen Medium ist der Schritt zu der Konkurrenz ein so kleiner wie im Internet. Der User merkt, dann die Seite ihm zu lange lädt, er klickt auf Abbrechen (wenn er gutmütig ist vielleicht auch erst auf Aktualisieren, merkt dann aber, dass die Seite wirklich so lange zum Laden braucht) und tippt die URL der Konkurrenz in den Browser – weg ist er. Aber ist es wirklich so, dass wir die Ladezeit beim Client nicht Beschleunigen können?

Gegenfrage: Gäbe es diesen Beitrag wenn dem so wäre 😉
Haben Sie schon einmal auf die Verbindungsdetails einer Netzwerkverbindung geschaut (egal, ob LAN, DSL oder Modem)? Da steht etwas von Komprimierung. Ha, da haben wirs !!! Wir müssen einfach weniger Daten aber mit dem gleichen Inhalt senden.

In PHP (ab Version 4 und mit installierter zlib) funktioniert das recht einfach: Wir setzen einen Ausgabepuffer ein. Dadurch wird die letztliche Ausgabe, die unser Script erzeugt, nachdem das Scrpt fertig durchgearbeitet wurde, per gzip auf etwa ein Drittel der Originalgröße gepackt und diese gepackten Daten anschließend an den Client geschickt. Seit Jahren unterstützen moderne Browser (ja, ich zähle den IE hier mal eiskalt dazu 😉 ) das Entpacken dieses Datenstroms und können diesen dann korrekt darstellen.

In PHP:

//ganz am Anfang des Scripts aufrufen ob_start("ob_gzhandler");   echo "Mein ganzer HTML-Code";

Wenn ob_gzhandler als Callback-Funktion von ob_start() verwendet wird, kann es auch überprüfen, ob der anfragende Browser dieses Content-Encoding überhaupt untersützt. Denn wir wollen ja Uralt-Browser nicht ausschließen.

Einige Nachteile hat die Komprimierung aber schon:

Hx3 war so freundlich genau für diese Nachteile eine PHP-Klasse zu schreiben, die diese Nachteile behebt und trotzdem alle Vorteile beibehält. Hinzu kommt, dass die Klasse je nach Serverauslastung stärker oder weniger stark komprimiert (dazu ist allerdings ein eigener Server nötig, auf Shared Hosting glaube ich nicht, dass man auf die Datei ‚/proc/loadavg‘ zugreifen kann. Sollte man sich einmal ansehen – es wird nichts revolutionäres gemacht, aber wenn man der PHP-Funktion ob_gzhandler nicht so ganz traut, weil man zu wenig einstellen kann, dem sei dieses Tutorial ans Herz gelegt.