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

Revision 390, 5.1 KB (checked in by kovell, 13 years ago)

Fixes: sig mod works, apikill setting saved on admin panel, page cache does not attempt to double gzip, banner and award images have size set.

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