source: spip-zone/_plugins_/memoization/trunk/memo/apc.inc @ 111462

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

apc et apcu proposent un stockage en memoire partage entre les utilisateurs, il faut donc utiliser _CACHE_NAMESPACE pour compter la taille du seul cache du site concerne, ET faire la meme chose pour vider le cache en appelant apc(u)_delete pour chaque cle du cache, car sinon apc(u)_clear_cache vide aussi le cache de tous les voisins sur le serveur

File size: 1.8 KB
Line 
1<?php
2if (!defined('_CACHE_NAMESPACE'))
3        define('_CACHE_NAMESPACE', $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].":");
4
5class MCacheBackend_apc extends MCacheBackend {
6
7        function key_for_lock($str) {
8                return _CACHE_NAMESPACE.md5($str."locked");
9        }
10
11        function get($key) {
12                $a = apc_fetch(_CACHE_NAMESPACE.$key);
13                // maybe_unserialize
14                if (is_array($a))
15                        return @unserialize($a[0]);
16                else
17                        return $a;
18        }
19       
20        function set($key, $value, $ttl=null) {
21                // maybe_serialize
22                if (is_object($value) OR is_array($value))
23                        $value = array(serialize($value));
24                return is_null($ttl)
25                        ? apc_store(_CACHE_NAMESPACE.$key, $value)
26                        : apc_store(_CACHE_NAMESPACE.$key, $value, $ttl);
27        }
28       
29        function exists($key) {
30                return apc_exists(_CACHE_NAMESPACE.$key);
31        }
32       
33        function del($key) {
34                return apc_delete(_CACHE_NAMESPACE.$key);
35        }
36       
37        function inc($key, $value=null, $ttl=null) {
38                while (true) {
39                        if ($this->lock($key)) {
40                                $value = isset($value) ? intval($value) : 1;
41                                $value += intval($this->get($key));
42                                $this->set($key, $value, $ttl);
43                                $this->unlock($key);
44                                return $value;
45                        }
46                }
47        }
48       
49        function dec($key, $value=null, $ttl=null) {
50                $value = isset($value) ? intval($value) : 1;
51                return $this->inc($key, -$value, $ttl);
52        }
53
54        function lock($key, /* private */ $unlock = false) {
55           return apc_add($this->key_for_lock($key), true);
56        }
57       
58        function unlock($key) {
59                return apc_delete($this->key_for_lock($key));
60        }
61
62        function size() {
63                if (!class_exists('APCIterator'))
64                        return false;
65                $a = new APCIterator('user', '/^'.preg_quote(_CACHE_NAMESPACE).'/', APC_ITER_ALL, 256*256);
66                return $a->getTotalSize ();
67        }
68
69        function purge() {
70                if (!class_exists('APCIterator'))
71                        return false;
72                $a = new APCIterator('user', '/^'.preg_quote(_CACHE_NAMESPACE).'/', APC_ITER_ALL, 256*256);
73                foreach ($a as $cache) {
74                        apc_delete($cache['key']);
75                }
76                return true;
77        }
78
79}
Note: See TracBrowser for help on using the repository browser.