Sie sind hier : sebastian1012.bplaced.net/ homepage-neu / kreuz-und-quer / tutorials-info-neuigkeiten-php / mod_gzip-mod_deflate-und-sonstige-komprimierungsverfahren-fuer-web-inhalte.php

mod_gzip, mod_deflate und sonstige Komprimierungsverfahren für Web-Inhalte

Bei den meisten Webprojekten dauert die Übertragung des HTML-Codes zum Client länger als die Generierung der Inhalte auf dem Server. Zusätzlich besteht immer das Problem, dass Bandbreite auf Servern / Webhosting-Paketen oft (teuer bezahlte) Mangelware ist. Dieses Problem und wie man es umgehen kann, habe ich bereits in einem früheren Beitrag beschrieben. Diesmal möchte ich weitere Möglichkeiten der Bandbreiteneinsparung zusammenfassen.

Die Basis für die Komprimierung des HTML-Codes ist es, dass moderne Browser mit GZIP umgehen können. Dazu senden Sie einen entsprechenden Header-Eintrag im HTTP-Request namens Accept-Encoding. Anhand dieses Eintrags kann serverseitig bestimmt werden, ob der Browser des anfragenden Clients GZIP-Koprimierung der Inhalte unterstützt. Wenn ja, darf man diese Möglichkeit auch nutzen und kann alle zum CLient zu übertragenden Inhalte komprimieren. Das spart bis zu 80%!

Doch vorweg noch eine andere Sache: Alle hier genannten Komprimierungsverfahren sind nur sinnvoll, wenn die serverseitige Generierung des HTML-Codes wirklich schneller ist als die Übertragung zum Client. Wenn ihr mehrsekündige SQL-Abfragen ausführt, solltet ihr auf Komprimierung lieber verzichten, da die Komprimierung stets warten muss bis das gesamte HTML-Dokument fertig ist. Wenn ihr also solch lange Abfragen habt und diese auch nicht verbessert bekommt, dann solltet ihr auf Komprimierung verzichten, da der User dann zumindest schon etwas von der Seite sieht und nicht ewig warten muss.
Also: Erster Schritt ist die Optimierung der SQL-Abfragen bzw. allgemein der Seitengenerierung (eventuell durch Caching) und anschließend die GZIP-Komprimierung.

Nun gibt es mehrere Möglichkeiten die Komprimierung vorzunehmen: mod_gzip, mod_deflate, ob_gzhandler.

mod_gzip und mod_deflate
Der Apache-Webserver (und andere auch, aber ich möchte es anhand des Apache beschreiben) unterstützt die GZIP-Komprimierung ohne Code-Veränderung der Anwendung. Das bedeutet ihr müsst nicht eure ganzen Scripte umschreiben, sondern steuert alles über besagte Module mod_gzip und mod_deflate sowie die .htaccess-Datei. Ob mod_gzip oder mod_deflate derzeit installiert ist, lässt sich einfach per phpinfo() prüfen.

Die Komprimierung mit mod_deflate aktiviert man nun, indem folgende Zeilen in die .htaccess geschrieben werden:

# Komprimierung nach MIME-Type: Text, HTML und XML komprimieren AddOutputFilterByType DEFLATE text/html text/plain text/xml       # ODER: bestimmte Dateiendungen komprimieren (hier .html) <Files *.html> SetOutputFilter DEFLATE    </Files>
Nun werden also alle angegebenen Dateien gepuffert und komprimiert.

Eine andere feine Geschichte ist es, dass man nicht nur HTML sondern auch andere Textdaten komprimieren kann (CSS, JavaScript und was man sonst noch so hat):

<Location />     SetOutputFilter DEFLATE      SetEnvIfNoCase Request_URI  \            \.(?:gif|jpe?g|png)$ no-gzip dont-vary      SetEnvIfNoCase Request_URI  \            \.(?:exe|t?gz|zip|gz2|sit|rar)$ no-gzip dont-vary    </Location>
Diese Variante komprimiert alle Daten außer Bildern und Binärdaten (exe sowie bereits komprimiete Archive).

Wer mod_gzip hat, der muss einen anderen Code in die .htaccess eintragen.

<IfModule mod_gzip.c>       mod_gzip_on       Yes        mod_gzip_dechunk  Yes        mod_gzip_item_include file      \.(html?|txt|css|js|php|pl)$        mod_gzip_item_include handler   ^cgi-script$        mod_gzip_item_include mime      ^text/.*        mod_gzip_item_include mime      ^application/x-javascript.*        mod_gzip_item_exclude mime      ^image/.*        mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*    </IfModule>
Hierbei wird die Entscheidung, ob eine Datei komprimiert werden soll (oder nicht) über reguläre Ausrücke der Dateiendung oder des MIME-Typs getroffen.

ob_gzhandler
Was aber, wenn man ein Shared-Hosting-Paket hat und der Webhoster mod_gzip und mod_deflate weder unterstützt noch bereit ist zu installieren? Dann kann man immernoch PHP-Funktionen verwenden. Das funktioniert über die Funktion ob_gzhandler.
Dazu muss in jede Datei, die man komprimieren möchte, folgender Code ganz am Anfang eingefügt werden:

<?php    ob_start("ob_gzhandler");     ?>

Man muss dabei nicht selbst überprüfen, ob der Client GZIP unterstützt, da das die Funktion selbst übernimmt. Das einzige Problem an dieser Variante ist, dass wirklich alle zu komprimierenden Dateien bearbeitet werden müssen, es sei denn …

… auto_prepend_file
Wer nicht alle Dateien einzeln bearbeiten möchte, kann einfach eine PHP-Datei mit dem ob_start(„ob_gzhandler“) erstellen (nur diesen Code, nichts weiter) und sagt dem Apache anschließend, dass er diese Datei vor dem Bearbeiten einer anderen Datei einfügen soll, indem folgender Code in die .htaccess eingefügt wird:

&lt;FilesMatch "\.(txt|html|htm|php)"&gt;       ForceType application/x-httpd-php        php_value auto_prepend_file /the/full/path/gzip-enable.php &lt;/FilesMatch&gt;
Dieser Code besagt, dass die Datei immer eingefügt werden soll, wenn die Dateiendung txt, html, htm oder php ist. Anschließend wird der Webserver angewiesen diese Datei zwingend durch den PHP-Parser zu schicken (sonst hätte man bei Aufruf einer txt-Datei einfach den Code ob_start(„ob_gzhandler“) am Anfang stehen). Und zuletzt wird noch der Pfad zu dem soeben erstellten Script angegeben.
Wem diese Variante gefällt, der kann natürlich die Prepend-Dateien auch für andere Dateitypen erweitern (CSS und JS – Achtung, hier muss der Content-Type gesetzt werden) und die so komprimierten Dateien auch noch cachen:

<?php         // Datenpufferung aktivieren, am Ende gesamten Inhalt an ob_gzhandler übergeben     ob_start ("ob_gzhandler");         // korrekten Content-Type setzen     header ("content-type: text/css; charset: UTF-8");         // Client-Cache anweisen sicht strikt an diese Anweisungen zu halten     header ("cache-control: must-revalidate");         // wie lange soll der Content gecached werden     $offset = 60 * 60;         // Ablauf-Datum setzen     $expire = "expires: " . gmdate ("D, d M Y H:i:s", time() + $offset) . " GMT";         // Header senden    header ($expire);    ?>

Und dann das hier in die .htaccess:

<FilesMatch "\.(css)">       ForceType application/x-httpd-php           php_value auto_prepend_file "/the/full/path/of/this/file/gzip-css.php"       </FilesMatch> 

Falls ihr noch weitere Möglichkeiten kennt zum Komprimieren oder sinnvolle Erweiterungen für die hier angegebenen Codes, würde ich mich über Kommentare freuen!