source: spip-zone/_plugins_/memoization/inc/memoization.php @ 70164

Last change on this file since 70164 was 70164, checked in by cedric@…, 7 years ago

Attention : $_SERVERHTTP_HOST? est fournie par l'envoyeur et n'est pas fiable.
http://localhost:8888/ affichee dans le navigateur fournit 'localhost:8888'
mais
curl "http://localhost:8888/" fournit 'localhost' et perd la memoization (perte de cache sur le cron asynchrones par exemple)

On prefere utiliser SERVER_NAME et SERVER_PORT fournies par le serveur.

File size: 5.3 KB
Line 
1<?php
2
3/* prototype de backend */
4class MCacheBackend {
5        function get($key) {}
6        function set($key, $value, $ttl=null) {}
7        function exists($key) {}
8        function del($key) {}
9        function inc($key, $value=null, $ttl=null) {}
10        function dec($key, $value=null, $ttl=null) {}
11        function lock($key, /* private */ $unlock = false) {}
12        function unlock($key) {}
13        function init($params = null) {}
14}
15
16/* objet MCache */
17class MCache {
18        var $methode;
19        var $backend;
20
21        function memory() {
22                return !in_array($this->methode, array('filecache', 'nocache'));
23        }
24
25        function MCache($methode=null, $params=array()) {
26                // autodetect
27                $this->methode = $methode ? $methode : $this->methode();
28                $f = find_in_path($this->methode.'.inc',"memo/");
29                require_once $f;
30                $obj = 'MCacheBackend_'.$this->methode;
31                $this->backend = new $obj;
32                $this->backend->init($params);
33        }
34
35        function methode($methode = null) {
36                if (!$methode) {
37                        $methodes = array('apc', 'xcache', 'eaccelerator', 'filecache', 'nocache');
38                        while (!MCache::methode($methode = array_shift($methodes))){};
39                        return $methode;
40                }
41
42                switch($methode) {
43                        case 'apc':
44                                return function_exists('apc_exists');
45                        case 'xcache':
46                                if (!function_exists('xcache_set'))
47                                        return false;
48                                @xcache_set('xcache_autodetect',1234);
49                                return @xcache_get('xcache_autodetect')==1234;
50                        case 'memcache':
51                                return function_exists('memcache_set');
52                        case 'eaccelerator':
53                                return function_exists('eaccelerator_put');
54                        case 'filecache':
55                        case 'nocache':
56                                return true;
57                }
58        }
59
60        /* mixed */
61        function get($key) {
62                return $this->backend->get($key);
63        }
64       
65        /* bool */
66        function set($key, $value, $ttl=null) {
67                return $this->backend->set($key, $value, $ttl);
68        }
69       
70        /* bool */
71        function exists($key) {
72                return $this->backend->exists($key);
73        }
74       
75        /* bool */
76        function del($key) {
77                return $this->backend->del($key);
78        }
79       
80        /* int */
81        function inc($key, $value=null, $ttl=null) {
82                return $this->backend->inc($key, $value, $ttl);
83        }
84       
85        /* int */
86        function dec($key, $value=null, $ttl=null) {
87                return $this->backend->dec($key, $value, $ttl);
88        }
89       
90        /* null */
91        function lock($key) {
92                return $this->backend->lock($key);
93        }
94       
95        /* null */
96        function unlock($key) {
97                return $this->backend->unlock($key);
98        }
99
100        /* mixed */
101        function size() {
102                if (method_exists($this->backend, 'size'))
103                        return $this->backend->size();
104        }
105}
106
107
108if (!isset($GLOBALS['meta']['cache_namespace'])){
109        include_spip('inc/acces');
110        ecrire_meta('cache_namespace', dechex(crc32($_SERVER["DOCUMENT_ROOT"] . $_SERVER["SERVER_SIGNATURE"] . creer_uniqid())), 'non');
111}
112if (!defined('_CACHE_NAMESPACE'))
113        define('_CACHE_NAMESPACE', $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].':'.$GLOBALS['meta']['cache_namespace'].':');
114
115global $Memoization;
116
117$cfg = @unserialize($GLOBALS['meta']['memoization']);
118$Memoization = new MCache(preg_replace(",\W,","",$cfg['methode']));
119
120
121/* mode procedural */
122
123/* mixed */
124function cache_get($key) {
125        global $Memoization;
126        return $Memoization->get($key);
127}
128
129/* bool */
130function cache_set($key, $value, $ttl=null) {
131        global $Memoization;
132        return $Memoization->set($key, $value, $ttl);
133}
134
135/* bool */
136function cache_exists($key) {
137        global $Memoization;
138        return $Memoization->exists($key);
139}
140function cache_isset($key) { # obsolete
141        global $Memoization;
142        return $Memoization->exists($key);
143}
144
145/* bool */
146function cache_del($key) {
147        global $Memoization;
148        return $Memoization->del($key);
149}
150function cache_unset($key) { # obsolete
151        global $Memoization;
152        return $Memoization->del($key);
153}
154
155/* int */
156function cache_inc($key, $value=null, $ttl=null) {
157        global $Memoization;
158        return $Memoization->inc($key, $value, $ttl);
159}
160
161/* int */
162function cache_dec($key, $value=null, $ttl=null) {
163        global $Memoization;
164        return $Memoization->dec($key, $value, $ttl);
165}
166
167/* null */
168function cache_lock($key) {
169        global $Memoization;
170        return $Memoization->lock($key, $value, $ttl);
171}
172
173/* null */
174function cache_unlock($key) {
175        global $Memoization;
176        return $Memoization->unlock($key, $value, $ttl);
177}
178
179/* filtre pour la page de cfg */
180function memoization_methode($methode=null) {
181        return MCache::methode($methode);
182}
183
184
185//
186// Cache a function's result cache_me()
187// (c) Fil 2009 - Double-licensed under the GNU/LGPL and MIT licenses
188// http://zzz.rezo.net/-SPIP-
189// $ttl = time to live
190// $vars = other variables that could change the result
191// (the function's variables are automatically taken into account)
192//
193// Usage: include_spip('inc/memoization');
194// In any cacheable function add at top:
195// if(!is_null($c=cache_me())) return$c;
196if (!function_exists('debug_backtrace')) {
197        function cache_me() {return;}
198} else {
199        function cache_me($vars=null, $ttl=3600) {
200                $trace = debug_backtrace();
201                $trace = $trace[1];
202                if (isset($trace['object']))
203                        $fun = array($trace['object'], $trace['function']);
204                else
205                        $fun = $trace['function'];
206                $key = md5(
207                        $fun
208                        .serialize($trace['args'])
209                        .serialize($vars)
210                );
211                if (!cache_exists($key)) {
212                        cache_set($key, null, $ttl);
213                        $r = call_user_func_array($fun, $trace['args']);
214                        cache_set($key, $r, $ttl);
215                        return $r;
216                }
217                return cache_get($key);
218        }
219}
220
221// outil pour memcache (hosts et ports a configurer dans le CFG)
222function cfg_memcache_servers() {
223        $cfg = @unserialize($GLOBALS['meta']['memoization']);
224        if (!$cfg = $cfg['memcache_servers'])
225                $cfg = 'localhost:11211';
226        preg_match_all('/[a-z0-9._-]*(?::\d+)/', $cfg, $s, PREG_PATTERN_ORDER);
227        return $s[0];
228}
229
230?>
Note: See TracBrowser for help on using the repository browser.