You are not logged in.

This articles has been requested to be deleted.

Sunday, March 7th 2010, 1:45pm

Tags

Browser, gzip, http, performance

Abstract

Webinhalte lassen sich transparent für den Client komprimieren. Dadurch baut sich die Seite beim Betrachter schneller auf und der Server wird entlastet, weil der Prozess schneller beendet wird.

Article

1. Instrumente


Um die Ladezeiten der Webseiten besser einschätzen zu können, nutzen wir Firefox mit aktiviertem Firebug Plugin.

2. Original


Als Vorlage für dieses Tutorial nehmen wir die Webseite der deutschen Wikipedia. Die Seite ist schon hoch optimiert, dennoch können wir das Beispiel nutzen um noch besser zu sein.
Link: http://demo.easy-coding.de/performance/original

3. Optimierung - Dynamische Seiten


Wir nutzen die eigene, sehr schlanke Bibliothek HeaderUtil. Der Quellcode der Datei ist ausreichend dokumentiert.
In allen dynamischen Skripte mit PHP fügen wir das Script wie folgt an den Beginn der Datei ein.

Diff

1
2
3
4
5
6
7
8
9
--- original/index.php	2009-10-29 21:10:09.000000000 +0100
+++ gzip/index.php	2009-10-29 21:15:01.000000000 +0100
@@ -1,4 +1,7 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<?php
+require_once 'HeaderUtil.php';
+HeaderUtil::startOutput();
+?><!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html dir="ltr" xml:lang="de" xmlns="http://www.w3.org/1999/xhtml" lang="de"><head>





Wir sehen, dass die Index Datei von 37 KB auf 10 KB schrumpft.

4. Optimierung statische Inhalte


Statische Inhalte lassen sich ähnlich einfach manipulieren. Wir geben sie nicht direkt an den Browser, sondern lassen die Auslieferung über ein PHP Script steuern.
Dass die Dateien dabei den selben Dateinamen behalten, lässt sich über mod rewrite realisieren.

Wir erzeugen folgende .htaccess Datei:

wcf.bbcode.htaccess.title

1
2
RewriteEngine On
RewriteRule (^.+\.(js|css))$ gzip.php?file=$1&mime=$2 [L]


Die gzip.php sieht wie folgt aus. In der Variable $dirs = array('wiki_files') habe ich alle erlaubten Ordner gepackt.
Damit wird verhindert, dass ungewollt geschützte Dateien wie z.B. eine config.php ausgeliefert werden.

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php
require_once 'HeaderUtil.php';
HeaderUtil::startOutput();
 
// input params
$file = isset($_GET['file']) ? $_GET['file'] : exit;
$mime = isset($_GET['mime']) ? $_GET['mime'] : exit;
 
// settings
$whitelist = array();
$dirs = array('wiki_files');
$mimes = array(
	'js' => 'application/x-javascript',
	'css' => 'text/css'
);
 
// supported mimetype?
if(!array_key_exists($mime, $mimes)) {
	exit;
}
 
// includes in whitelist
foreach($dirs as $dir) {
	foreach(scandir($dir) as $filename) {
		$whitelist[] = $dir.'/'.$filename;
	}
}
 
if(!in_array($file, $whitelist)) {
	exit;
}
 
$content = file_get_contents($file);
 
// ATTENTION: this exits if header timestamp (If-Modified-Since) is file timestamp
HeaderUtil::sendLastModified(filemtime($file));
 
// remember for 30 days in browser cache
HeaderUtil::sendMaxAge(86400 * 30);
 
// send content type
HeaderUtil::sendContentType($mimes[$mine]);
 
// output
echo $content;
?>





Wir sehen, dass die Gesamtdateigröße von 264 KB auf 128 KB reduziert wird.

5. Demo + Download


Alles zu sehen gibt es unter http://demo.easy-coding.de/performance/original/ und http://demo.easy-coding.de/performance/gzip/.
Den Download der gzip Files findet ihr hier: http://demo.easy-coding.de/performance/gzip/download.zip
Torben Brodt has attached the following images:
  • original-index.png
  • original-gzip.png
  • static-gzip.png
  • static-original.png

Lexikon 4.1.3, developed by www.viecode.com