Toms Welt

/programmiert/gziped

gziped

Für den Firefox gibt es ja das tolle Addon Web-Developer mit sehr hilfreichen Funktionen, wenn man Webseiten erstellt. Unter anderem kann man sich auch die Dateigröße anzeigen lassen. Bei meiner Startseite sieht das momentan so aus.

Normalerweise müssen also 489 KB runtergeladen werden, zumindest wenn der Browsercache keine entsprechenden Daten enthält. Nachdem ich nun aber die Komprimierung aktiviert habe, sind es nur noch 280 KB. Dies wird dadurch erreicht, dass die Textdateien auf rund 25% verkleinert werden. Die Grafiken lasse ich außen vor, denn die sollten eh schon komprimiert auf dem Server liegen, was man viel besser mit einem Grafikprogramm schafft. Da ist höchstens noch was an der Anzahl zu tun. :mrgreen:

Eigentlich kann der Apache-Webserver selbständig komprimieren. Was aber, wenn das beim eigenen Webspace-Anbieter, wie bei meinem, nicht implementiert ist?  :traurig: Glück im Unglück: PHP kann das mittels "zlib.output_compression" auch. Allerdings werden so nur PHP-Dateien komprimiert. Im obigen Bild ist das nur der erste Punkt. Besser als nichts, aber lange nicht genug. Stylesheets und Javascripte müssen auch noch schrumpfen.

Das habe ich über einen kleinen Umweg und einiger Recherche im Internet geschafft. Alle Dateien mit der Endung .css und .js werden per PHP komprimiert und erst dann an den Browser geschickt. Mit Erfolg, weitere 170 KB eingespart. Dazu wird die .htaccess um

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{REQUEST_URI} (\.css|\.js)$
  RewriteRule ^(.+)$ /script/gzipit.php?file=%{REQUEST_URI}
</IfModule>


erweitert. Die .css- und .js-Dateien werden also an "/script/gzipit.php" übergeben. Meine gzipit.php kannst du hier sehen und in das entsprechende Verzeichnis (z.B. script) packen. Das ganze funktioniert leider nur, wenn "rewrite" im Apachen erlaubt ist, was wiederum vom Anbieter abhängt.

?php
if ( empty($_GET['file']) )
{
    header("Content-Type: text/html");
    echo 'ERROR: NO FILE!';
}
else
{
    $start = microtime();

    // get file type
    if ( strpos($_GET['file'], '.css') !== false )
        $type = 'text/css';
    else if ( strpos($_GET['file'], '.js') !== false )
        $type = 'text/javascript';
    else
        $type = 'text/html';

    // read file
    $filename = "{$_SERVER['DOCUMENT_ROOT']}{$_GET['file']}";
    $modified = filemtime("$filename");
    $file = fopen($filename, 'r');
    $content = fread($file, filesize($filename));
    fclose($file);

    // only one compression
    if ( !ini_get('zlib.output_compression') )
        ob_start("ob_gzhandler");

    // set header
    header("Last-Modified: ".gmdate("D, d M Y H:i:s",$modified)." GMT");
    header("ETag: ".md5($modified));
    header("Cache-Control: public");
    header("Content-Type: $type");

    if (!isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && is_callable('apache_request_headers')) {
        $header = apache_request_headers();
        if (isset($header['If-Modified-Since'])) {
            $_SERVER['HTTP_IF_MODIFIED_SINCE'] = $header['If-Modified-Since'];
        }
    }

    if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && $modified <= strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
        header("{$_SERVER['SERVER_PROTOCOL']} 304 Not Modified");
    }

    $time = (microtime() - $start) * 1000;

    // output
    echo '/* gzipit: '.$time.' ms - file last modified: '.gmdate("D, d M Y H:i:s",$modified)." */\n\n"
   .$content;
}
?>


Die Benutzung erfolgt natürlich auf eigene Gefahr. Wenn die Seite plötzlich sehr leer aussieht, ist wahrscheinlich der Pfad in der .htaccess falsch.
Bei WordPress ist es auch wichtig, dass die obigen Änderungen nach den WordPress-eigenen Zeilen in der .htaccess stehen, falls dort welche existieren.


Kommentar schreiben

Deine E-Mail-Adresse wird nicht veröffentlicht.

:mrgreen:  :D  :)  ;)  8-)  :O  :cry:  :(  :liebhab:  :-x  :-?  :P  :roll:  :arrow:  :schwitz:  :thumbsup:  :thumbup:  :thumbdown:  :facepalm:  :?:  :!:  :eis: