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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
<?php exit;
//Check everything exists before using it if(!isset($_SERVER['HTTP_ACCEPT_ENCODING'])) $_SERVER['HTTP_ACCEPT_ENCODING'] = ''; if(!isset($_SERVER['HTTP_USER_AGENT'])) $_SERVER['HTTP_USER_AGENT'] = '';
// Determine supported compression method $gzip = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip'); $deflate = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'deflate');
// Determine used compression method $encoding = $gzip ? 'gzip' : ($deflate ? 'deflate' : 'none');
// Check for buggy versions of Internet Explorer if (!strstr($_SERVER['HTTP_USER_AGENT'], 'Opera') && preg_match('/^Mozilla\/4\.0 \(compatible; MSIE ([0-9]\.[0-9])/i', $_SERVER['HTTP_USER_AGENT'], $matches)) { $version = floatval($matches[1]);
if ($version < 6) $encoding = 'none';
if ($version == 6 && !strstr($_SERVER['HTTP_USER_AGENT'], 'EV1')) $encoding = 'none'; }
//Some servers compress the output of PHP - Don't break in those cases if(ini_get('output_handler') == 'ob_gzhandler' || ini_get('zlib.output_compression') == 1) $encoding = 'none';
$iscompressed = file_exists(__FILE__.'.'.$encoding); if($encoding != 'none' && $iscompressed == false) { $flag = ($encoding == 'gzip' ? FORCE_GZIP : FORCE_DEFLATE); $code = file_get_contents(__FILE__.'.none'); $contents = gzencode($code,9,$flag); }else{ //Get data $contents = file_get_contents(__FILE__.'.'.$encoding); }
// first check if we have to send 304 // inspired by http://www.jonasjohn.de/snippets/php/caching.htm
$eTag=md5($contents); $modTime=filemtime(__FILE__.'.none');
date_default_timezone_set("UTC"); $eTagMatch = (isset($_SERVER['HTTP_IF_NONE_MATCH']) && strpos($_SERVER['HTTP_IF_NONE_MATCH'],$eTag)); $modTimeMatch = (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) === $modTime);
if (($modTimeMatch)||($eTagMatch)) { header('HTTP/1.1 304 Not Modified'); header('Connection: close'); } else { // send all sorts of headers $expireTime=60*60*24*355; // 1y max according to RFC if ($encoding != 'none') { header('Content-Encoding: '.$encoding); } header('Vary: Accept-Encoding'); header('Content-Length: '.strlen($contents)); header('Content-type: %%CONTENT%%; charset=utf-8'); header('Cache-Control: max-age='.$expireTime.', public, must-revalidate'); header('Cache-Control: max-age='.$expireTime.', public, immutable'); header('Expires: '.gmdate('D, d M Y H:i:s', time() + $expireTime).' GMT'); header('ETag: ' . $eTag); header('Last-Modified: '.gmdate('D, d M Y H:i:s', $modTime).' GMT');
// send output echo $contents;
//And write to filesystem cache if not done yet if($encoding != 'none' && $iscompressed == false) { //Write the content we sent file_put_contents(__FILE__.'.'.$encoding,$contents);
//And write the new content $flag = ($encoding == 'gzip' ? FORCE_DEFLATE : FORCE_GZIP); $ext = ($encoding == 'gzip' ? 'deflate' : 'gzip'); $contents = gzencode($code,9,$flag); file_put_contents(__FILE__.'.'.$ext,$contents); } }
|