Andrew's Web Libraries (AWL)
AwlCache.php
1 <?php
2 
10 class AwlCache {
11  private static $m;
12  private static $servers;
13  private static $working;
14 
18  function __construct() {
19  global $c;
20 
21  if ( isset(self::$working) ) return;
22 
23  self::$working = false;
24  if ( isset($c->memcache_servers) && class_exists('Memcached') ) {
25  dbg_error_log('Cache', 'Using Memcached interface connection');
26  self::$servers = $c->memcache_servers;
27  self::$m = new Memcached();
28  foreach( self::$servers AS $v ) {
29  dbg_error_log('Cache', 'Adding server '.$v);
30  $server = explode(',',$v);
31  if ( isset($server[2]) )
32  self::$m->addServer($server[0],$server[1],$server[2]);
33  else
34  self::$m->addServer($server[0],$server[1]);
35  }
36  self::$working = true;
37  // Hack to allow the regression tests to flush the cache at start
38  if ( isset($_SERVER['HTTP_X_DAVICAL_FLUSH_CACHE'])) $this->flush();
39  }
40  else {
41  dbg_error_log('Cache', 'Using NoCache dummy interface');
42  }
43  }
44 
48  function isActive() {
49  return self::$working;
50  }
51 
57  private function nskey( $namespace, $key ) {
58  return str_replace(' ', '%20', $namespace . (isset($key) ? '~~' . $key: '')); // for now.
59  }
60 
66  function get( $namespace, $key ) {
67  if ( !self::$working ) return false;
68  $ourkey = self::nskey($namespace,$key);
69  $value = self::$m->get($ourkey);
70 // var_dump($value);
71 // if ( $value !== false ) dbg_error_log('Cache', 'Got value for cache key "'.$ourkey.'" - '.strlen(serialize($value)).' bytes');
72  return $value;
73  }
74 
82  function set( $namespace, $key, $value, $expiry=864000 ) {
83  if ( !self::$working ) return false;
84  $ourkey = self::nskey($namespace,$key);
85  $nskey = self::nskey($namespace,null);
86  $keylist = self::$m->get( $nskey, null, $cas_token );
87  if ( isset($keylist) && is_array($keylist) ) {
88  if ( !isset($keylist[$ourkey]) ) {
89  $keylist[$ourkey] = 1;
90  $success = self::$m->cas( $cas_token, $nskey, $keylist );
91  $i=0;
92  while( !$success && $i++ < 10 && self::$m->getResultCode() == Memcached::RES_DATA_EXISTS ) {
93  $keylist = self::$m->get( $nskey, null, $cas_token );
94  if ( $keylist === false ) return false;
95  if ( isset($keylist[$ourkey]) ) break;
96  $keylist[$ourkey] = 1;
97  $success = self::$m->cas( $cas_token, $nskey, $keylist );
98  }
99  if ( !$success ) return false;
100  }
101  }
102  else {
103  $keylist = array( $ourkey => 1 );
104  self::$m->set( $nskey, $keylist );
105  }
106 // var_dump($value);
107 // dbg_error_log('Cache', 'Setting value for cache key "'.$ourkey.'" - '.strlen(serialize($value)).' bytes');
108  return self::$m->set( $ourkey, $value, $expiry );
109  }
110 
116  function delete( $namespace, $key ) {
117  if ( !self::$working ) return false;
118  $nskey = self::nskey($namespace,$key);
119  dbg_error_log('Cache', 'Deleting from cache key "'.$nskey.'"');
120  if ( isset($key) ) {
121  self::$m->delete( $nskey );
122  }
123  else {
124  $keylist = self::$m->get( $nskey, null, $cas_token );
125  if ( isset($keylist) ) {
126  self::$m->delete( $nskey );
127  if ( is_array($keylist) ) {
128  foreach( $keylist AS $k => $v ) self::$m->delete( $k );
129  }
130  }
131  }
132  }
133 
137  function flush( ) {
138  if ( !self::$working ) return false;
139  dbg_error_log('Cache', 'Flushing cache');
140  self::$m->flush();
141  }
142 
143 
147  function acquireLock( $something, $wait_for = 5 ) {
148  if ( !self::$working ) return $something;
149  $wait_until = time() + $wait_for;
150  while( self::$m->add('_lock_'+$something,1,5) === false && time() < $wait_until ) {
151  usleep(10000);
152  }
153  return $something;
154  }
155 
156 
160  function releaseLock( $something ) {
161  if ( !self::$working ) return;
162  self::$m->delete('_lock_'+$something);
163  }
164 }
165 
166 
167 function getCacheInstance() {
168  static $ourCacheInstance;
169 
170  if ( !isset($ourCacheInstance) ) $ourCacheInstance = new AWLCache('Memcached');
171 
172  return $ourCacheInstance;
173 }
AwlCache\acquireLock
acquireLock( $something, $wait_for=5)
Definition: AwlCache.php:147
AwlCache\__construct
__construct()
Definition: AwlCache.php:18
AwlCache\nskey
nskey( $namespace, $key)
Definition: AwlCache.php:57
AwlCache
Definition: AwlCache.php:10
AwlCache\flush
flush()
Definition: AwlCache.php:137
AwlCache\isActive
isActive()
Definition: AwlCache.php:48
AwlCache\releaseLock
releaseLock( $something)
Definition: AwlCache.php:160