source: spip-zone/_plugins_/memoization/trunk/memoization_options.php @ 114180

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

Ne plus faire de ecrire_meta() sauvage dans le options, ca fait planter les sites pas encore installes - on utilise la maj de base puisqu'on en a maintenant une sur ce plugin, et par defaut le plugin tourne avec les define() fallback dans chaque methode de memoization

File size: 7.3 KB
Line 
1<?php
2
3if (!defined('_ECRIRE_INC_VERSION')) return;
4
5/* prototype de backend */
6class MCacheBackend {
7        function get($key) {}
8        function set($key, $value, $ttl=null) {}
9        function exists($key) {}
10        function del($key) {}
11        function inc($key, $value=null, $ttl=null) {}
12        function dec($key, $value=null, $ttl=null) {}
13        function lock($key, /* private */ $unlock = false) {}
14        function unlock($key) {}
15        function init($params = null) {}
16        function purge() {}
17}
18
19/* objet MCache */
20class MCache {
21        var $methode;
22        var $backend;
23
24        function memory() {
25                return !in_array($this->methode, array('filecache', 'nocache'));
26        }
27
28        function __construct($methode=null, $params=array()) {
29                // autodetect
30                $this->methode = $methode ? $methode : $this->methode();
31                $f = find_in_path($this->methode.'.inc',"memo/");
32                require_once $f;
33                $obj = 'MCacheBackend_'.$this->methode;
34                $this->backend = new $obj;
35                $this->backend->init($params);
36        }
37
38        static function methode($methode = null) {
39
40                if (!$methode) {
41                        $methodes = array('apcu', 'apc', 'xcache', 'filecache', 'nocache');
42                        while (!MCache::methode($methode = array_shift($methodes))){};
43                        return $methode;
44                }
45
46                switch($methode) {
47                        case 'apc':
48                                return function_exists('apc_exists');
49                        case 'apcu':
50                                return function_exists('apcu_exists');
51                        case 'xcache':
52                                if (!function_exists('xcache_set'))
53                                        return false;
54                                @xcache_set('xcache_autodetect',1234);
55                                return @xcache_get('xcache_autodetect')==1234;
56                        case 'memcache':
57                                return function_exists('memcache_set');
58                        case 'memcached':
59                                return class_exists('Memcached');
60                        case 'redis':
61                                return extension_loaded('redis');
62                        case 'filecache':
63                        case 'nocache':
64                                return true;
65                }
66        }
67
68        /* mixed */
69        function get($key) {
70                return $this->backend->get($key);
71        }
72       
73        /* bool */
74        function set($key, $value, $ttl=null) {
75                return $this->backend->set($key, $value, $ttl);
76        }
77       
78        /* bool */
79        function exists($key) {
80                return $this->backend->exists($key);
81        }
82       
83        /* bool */
84        function del($key) {
85                return $this->backend->del($key);
86        }
87       
88        /* int */
89        function inc($key, $value=null, $ttl=null) {
90                return $this->backend->inc($key, $value, $ttl);
91        }
92       
93        /* int */
94        function dec($key, $value=null, $ttl=null) {
95                return $this->backend->dec($key, $value, $ttl);
96        }
97       
98        /* null */
99        function lock($key) {
100                return $this->backend->lock($key);
101        }
102       
103        /* null */
104        function unlock($key) {
105                return $this->backend->unlock($key);
106        }
107
108        /* mixed */
109        function size() {
110                if (method_exists($this->backend, 'size'))
111                        return $this->backend->size();
112        }
113
114        /* bool */
115        function purge() {
116                if (method_exists($this->backend, 'purge'))
117                        return $this->backend->purge();
118                else
119                        return false;
120        }
121
122}
123
124if (isset($GLOBALS['meta']['cache_namespace'])) {
125        if (!defined('_CACHE_NAMESPACE')) {
126                define('_CACHE_NAMESPACE', $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].':'.$GLOBALS['meta']['cache_namespace'].':');
127        }
128        if (isset($GLOBALS['meta']['cache_key'])) {
129                define('_CACHE_KEY', $GLOBALS['meta']['cache_key']);
130        }
131}
132
133global $Memoization;
134
135$cfg = @unserialize($GLOBALS['meta']['memoization']);
136$Memoization = new MCache(preg_replace(",\W,","",$cfg['methode']));
137
138
139/* mode procedural */
140
141/* mixed */
142function cache_get($key) {
143        global $Memoization;
144        return $Memoization->get($key);
145}
146
147/* bool */
148function cache_set($key, $value, $ttl=null) {
149        global $Memoization;
150        return $Memoization->set($key, $value, $ttl);
151}
152
153/* bool */
154function cache_exists($key) {
155        global $Memoization;
156        return $Memoization->exists($key);
157}
158function cache_isset($key) { # obsolete
159        global $Memoization;
160        return $Memoization->exists($key);
161}
162
163/* bool */
164function cache_del($key) {
165        global $Memoization;
166        return $Memoization->del($key);
167}
168function cache_unset($key) { # obsolete
169        global $Memoization;
170        return $Memoization->del($key);
171}
172
173/* int */
174function cache_inc($key, $value=null, $ttl=null) {
175        global $Memoization;
176        return $Memoization->inc($key, $value, $ttl);
177}
178
179/* int */
180function cache_dec($key, $value=null, $ttl=null) {
181        global $Memoization;
182        return $Memoization->dec($key, $value, $ttl);
183}
184
185/* null */
186function cache_lock($key) {
187        global $Memoization;
188        return $Memoization->lock($key);
189}
190
191/* null */
192function cache_unlock($key) {
193        global $Memoization;
194        return $Memoization->unlock($key);
195}
196
197/* null */
198function cache_purge() {
199        global $Memoization;
200        return $Memoization->purge();
201}
202
203/* filtre pour la page de cfg */
204function memoization_methode($methode=null) {
205        return MCache::methode($methode);
206}
207
208
209/**
210 * Recuperer de l'editorial cache, mais invalide avec la meta derniere_modif ou avec un var_mode
211 * @param string $key
212 * @return string
213 */
214function cache_edito_get($key) {
215        if (function_exists('cache_get')
216          and !_VAR_MODE
217          and $cache = cache_get("edito-$key")
218          and isset($cache['time'])
219          and isset($cache['value'])
220          and (!isset($GLOBALS['meta']['derniere_modif']) or $cache['time']>$GLOBALS['meta']['derniere_modif'])) {
221                return $cache['value'];
222        }
223
224        return null;
225}
226
227/**
228 * Stocker de l'editorial cache, avec un timestamp pour gerer l'invalidation
229 * @param string $key
230 * @param mixed $value
231 * @return mixed
232 */
233function cache_edito_set($key, $value) {
234        if (function_exists('cache_set')) {
235                $cache = array('value' => $value, 'time' => $_SERVER['REQUEST_TIME']);
236                cache_set("edito-$key", $cache);
237        }
238        return $value;
239}
240
241
242//
243// Cache a function's result cache_me()
244// (c) Fil 2009 - Double-licensed under the GNU/LGPL and MIT licenses
245// http://zzz.rezo.net/-SPIP-
246// $ttl = time to live
247// $vars = other variables that could change the result
248// (the function's variables are automatically taken into account)
249//
250// Usage: include_spip('inc/memoization');
251// In any cacheable function add at top:
252// if(!is_null($c=cache_me())) return$c;
253if (!function_exists('debug_backtrace')) {
254        function cache_me() {return;}
255} else {
256        function cache_me($vars=null, $ttl=3600) {
257                $trace = debug_backtrace();
258                $trace = $trace[1];
259                if (isset($trace['object']))
260                        $fun = array($trace['object'], $trace['function']);
261                else
262                        $fun = $trace['function'];
263                $key = md5(
264                        $fun
265                        .serialize($trace['args'])
266                        .serialize($vars)
267                );
268                if (!cache_exists($key)) {
269                        cache_set($key, null, $ttl);
270                        $r = call_user_func_array($fun, $trace['args']);
271                        cache_set($key, $r, $ttl);
272                        return $r;
273                }
274                return cache_get($key);
275        }
276}
277
278// outil pour memcache (hosts et ports a configurer dans le CFG)
279function cfg_memcache_servers() {
280        $cfg = @unserialize($GLOBALS['meta']['memoization']);
281        if (!$cfg = $cfg['memcache_servers']) {
282                $cfg = 'localhost:11211';
283        }
284        preg_match_all('/[a-z0-9._-]*(?::\d+)/', $cfg, $s, PREG_PATTERN_ORDER);
285        return $s[0];
286}
287
288function cfg_redis_server() {
289        $cfg = @unserialize($GLOBALS['meta']['memoization']);
290        if (!$cfg || !isset($cfg['redis_type']) || empty($cfg['redis_type'])) {
291                $cfg = array(
292                        'redis_type' => 'serveur',
293                        'redis_server' => '127.0.0.1:6379',
294                        'redis_sock' => '/tmp/redis.sock',
295                        'redis_auth' => '',
296                        'redis_dbindex' => 0,
297                        'redis_serializer' => 'php',
298                );
299        }
300        return $cfg;
301}
302
303function redis_serializer() {
304        $serializers = array();
305        if (defined('Redis::SERIALIZER_IGBINARY') && extension_loaded('igbinary')) {
306                $serializers['igbinary'] = array('libelle' => 'SERIALIZER_IGBINARY', 'statut' => 'actif');
307        } else {
308                $serializers['igbinary'] = array('libelle' => 'SERIALIZER_IGBINARY', 'statut' => 'inactif');
309        }
310        $serializers['php'] = array('libelle' => 'SERIALIZER_PHP', 'statut' => 'actif');
311        return $serializers;
312}
Note: See TracBrowser for help on using the repository browser.