root/dev/common/includes/class.cache.php @ 388

Revision 388, 4.6 KB (checked in by kovell, 13 years ago)

Page cache fixes for comments.
refresh no longer reposts comment.
comments display again.
304 sent for refresh of cached pages.
html fixes

Line 
1<?php
2
3class cache
4{
5    function checkLoad()
6    {
7        if (PHP_OS != 'Linux')
8        {
9            return false;
10        }
11
12        $load = @file_get_contents('/proc/loadavg');
13        if (false === $load)
14        {
15            return false;
16        }
17        $array = explode(' ', $load);
18        if ((float)$array[0] > (float)config::get('reinforced_threshold'))
19        {
20            // put killboard into RF
21            config::set('is_reinforced', 1);
22        }
23        elseif ((float)$array[0] > (float)config::get('reinforced_disable_threshold') && config::get('is_reinforced'))
24        {
25            // do nothing, we are in RF, load is dropping but stil over disabling threshold
26        }
27        else
28        {
29            // load low, dont enter reinforced
30            config::set('is_reinforced', 0);
31        }
32    }
33
34    function shouldCache($page = '')
35    {
36        // never cache for admins
37        if (session::isAdmin())
38        {
39            return false;
40        }
41                // Don't cache the image files.
42                if (strpos($_SERVER['REQUEST_URI'],'thumb') ||
43                        strpos($_SERVER['REQUEST_URI'],'mapview')) return false;
44        if (config::get('auto_reinforced') && config::get('is_reinforced') && count($_POST) == 0)
45        {
46            return true;
47        }
48
49        $cacheignore = explode(',', config::get('cache_ignore'));
50                if (KB_CACHE == 1 && count($_POST) == 0 && !($page != '' && in_array($page, $cacheignore)))
51        {
52            return true;
53        }
54                return false;
55    }
56
57    function check($page)
58    {
59        if (cache::shouldCache($page))
60        {
61            if (!file_exists(KB_CACHEDIR.'/'.KB_SITE))
62            {
63                mkdir(KB_CACHEDIR.'/'.KB_SITE);
64            }
65                        // Include session info in the hash to support session-based security.
66            $cachefile = cache::genCacheName();
67            $times = explode(',', config::get('cache_times'));
68            foreach ($times as $string)
69            {
70                $array = explode(':', $string);
71                $cachetimes[$array[0]] = $array[1];
72            }
73
74            if ($cachetimes[$page])
75            {
76                $cachetime = $cachetimes[$page];
77            }
78            else
79            {
80                $cachetime = 10;
81            }
82            $cachetime = $cachetime * 60;
83
84                        if (config::get('is_reinforced'))
85            {
86                global $smarty;
87                $smarty->assign('message', 'Note: This killboard has entered reinforced operation mode.');
88                                // cache is extended in reinforced mode
89                                $cachetime = $cachetime * 20;
90            }
91                        if(file_exists($cachefile)) $timestamp = @filemtime($cachefile);
92                        else $timestamp = 0;
93            //$timestamp = ((@file_exists($cachefile))) ? @filemtime($cachefile) : 0;
94            if (time() - $cachetime < $timestamp)
95            {
96                                $etag=md5($cachefile);
97                                header("Last-Modified: ".gmdate("D, d M Y H:i:s", $timestamp)." GMT");
98// Breaks comment posting.
99//                              header('Expires: ' . gmdate('D, d M Y H:i:s', $timestamp + $cachetime) . ' GMT');
100                                header("Etag: ".md5($etag));
101                                header("Cache-Control:");
102                                header('Pragma:');
103
104                                if (@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $timestamp ||
105                                        trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag)
106                                {
107                                        header("HTTP/1.1 304 Not Modified");
108                                        exit;
109                                }
110
111                if(!ini_get('zlib.output_compression')) ob_start('ob_gzhandler');
112                                else ob_start();
113                @readfile($cachefile);
114                ob_end_flush();
115                exit();
116            }
117            ob_start();
118        }
119                header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
120//              header('Expires: ' . gmdate('D, d M Y H:i:s', time()+60) . ' GMT');
121                header("Etag: ".md5($cachefile));
122                header("Cache-Control:");
123                header('Pragma:');
124    }
125
126    function generate()
127    {
128        if (cache::shouldCache())
129        {
130            $cachefile = cache::genCacheName();
131            $fp = @fopen($cachefile, 'w');
132                        //@fwrite($fp, ob_get_contents());
133
134            @fwrite($fp, preg_replace('/profile -->.*<!-- \/profile/','profile -->Cached '.gmdate("d M Y H:i:s").'<!-- /profile',ob_get_contents()));
135            //if(!strpos($_SERVER['REQUEST_URI'], 'feed')) @fwrite($fp, '<!-- Generated from cache -->');
136            @fclose($fp);
137            ob_end_flush();
138        }
139    }
140
141        function deleteCache()
142        {
143                $cachefile = cache::genCacheName();
144                @unlink($cachefile);
145        }
146
147        function genCacheName()
148        {
149                return KB_CACHEDIR.'/'.KB_SITE.'/'.md5($_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].implode($_SESSION)).'.cache';
150        }
151}
152?>
Note: See TracBrowser for help on using the browser.