X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=CRM%2FUtils%2FCache%2FAPCcache.php;h=26fa86b24166bd6321aae2a44dbe0b8c7fd612f6;hb=694ccbf41adc31bce4d056fcc46930ba9c2e15e5;hp=0f2ed74255f5caf59b18e7e0942251d8bdeb44fe;hpb=e4636fa7912cc7a53ceaf61d4d0edb868a998f54;p=civicrm-core.git diff --git a/CRM/Utils/Cache/APCcache.php b/CRM/Utils/Cache/APCcache.php index 0f2ed74255..26fa86b241 100644 --- a/CRM/Utils/Cache/APCcache.php +++ b/CRM/Utils/Cache/APCcache.php @@ -1,7 +1,7 @@ _prefix . $key, $value, $this->_timeout)) { + public function set($key, $value, $ttl = NULL) { + CRM_Utils_Cache::assertValidKey($key); + if (is_int($ttl) && $ttl <= 0) { + return $this->delete($key); + } + + $ttl = CRM_Utils_Date::convertCacheTtl($ttl, $this->_timeout); + $expires = time() + $ttl; + if (!apc_store($this->_prefix . $key, ['e' => $expires, 'v' => $value], $ttl)) { return FALSE; } return TRUE; @@ -84,11 +96,17 @@ class CRM_Utils_Cache_APCcache implements CRM_Utils_Cache_Interface { /** * @param $key + * @param mixed $default * * @return mixed */ - public function get($key) { - return apc_fetch($this->_prefix . $key); + public function get($key, $default = NULL) { + CRM_Utils_Cache::assertValidKey($key); + $result = apc_fetch($this->_prefix . $key, $success); + if ($success && isset($result['e']) && $result['e'] > time()) { + return $this->reobjectify($result['v']); + } + return $default; } /** @@ -97,22 +115,33 @@ class CRM_Utils_Cache_APCcache implements CRM_Utils_Cache_Interface { * @return bool|string[] */ public function delete($key) { - return apc_delete($this->_prefix . $key); + CRM_Utils_Cache::assertValidKey($key); + apc_delete($this->_prefix . $key); + return TRUE; } public function flush() { $allinfo = apc_cache_info('user'); $keys = $allinfo['cache_list']; - $prefix = $this->_prefix . "CRM_"; // Our keys follows this pattern: ([A-Za-z0-9_]+)?CRM_[A-Za-z0-9_]+ + $prefix = $this->_prefix; // Our keys follows this pattern: ([A-Za-z0-9_]+)?CRM_[A-Za-z0-9_]+ $lp = strlen($prefix); // Get prefix length foreach ($keys as $key) { $name = $key['info']; if ($prefix == substr($name, 0, $lp)) { // Ours? - apc_delete($this->_prefix . $name); + apc_delete($name); } } + return TRUE; + } + + public function clear() { + return $this->flush(); + } + + private function reobjectify($value) { + return is_object($value) ? unserialize(serialize($value)) : $value; } }