Hier im Forum bekommt ihr bei euren fragen schnelle hilfe.Hier geht es rund um das Web SeitenProgrammieren.Alles rund ums Javascript,Html,Php,Css und Sql.Auf fast allen Fragen haben wir eine Antwort.
Der Soforthilfe-chat verspricht das ,was sein Name sagt. Hier sind Leute Online die sofort ihre hilfe anbieten.Seht in der OnlineListe nach und wenn einer Online ist werdet ihr auch antwort bekommen. Admine ,Moderatoren und Helfer sind unsere Spezialisten in Sachen Web Programierung
71 Unwetterwarnungen in Deutschland
Die Datenbank wurde zuletzt am 02.08.2020 17:34:28 aktualiesiert
71

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!