X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=CRM%2FUtils%2FCache%2FAPCcache.php;h=26fa86b24166bd6321aae2a44dbe0b8c7fd612f6;hb=694ccbf41adc31bce4d056fcc46930ba9c2e15e5;hp=a8b4e5cd6949fe49e901bf7492be5077bcaffa58;hpb=daf53354afbd58a33ede00dbed773cf30a0f560d;p=civicrm-core.git diff --git a/CRM/Utils/Cache/APCcache.php b/CRM/Utils/Cache/APCcache.php index a8b4e5cd69..26fa86b241 100644 --- a/CRM/Utils/Cache/APCcache.php +++ b/CRM/Utils/Cache/APCcache.php @@ -81,10 +81,14 @@ class CRM_Utils_Cache_APCcache implements CRM_Utils_Cache_Interface { * @return bool */ public function set($key, $value, $ttl = NULL) { - if ($ttl !== NULL) { - throw new \RuntimeException("FIXME: " . __CLASS__ . "::set() should support non-NULL TTL"); + CRM_Utils_Cache::assertValidKey($key); + if (is_int($ttl) && $ttl <= 0) { + return $this->delete($key); } - if (!apc_store($this->_prefix . $key, $value, $this->_timeout)) { + + $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; @@ -97,10 +101,12 @@ class CRM_Utils_Cache_APCcache implements CRM_Utils_Cache_Interface { * @return mixed */ public function get($key, $default = NULL) { - if ($default !== NULL) { - throw new \RuntimeException("FIXME: " . __CLASS__ . "::get() only supports NULL default"); + 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 apc_fetch($this->_prefix . $key); + return $default; } /** @@ -109,20 +115,22 @@ 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; @@ -132,4 +140,8 @@ class CRM_Utils_Cache_APCcache implements CRM_Utils_Cache_Interface { return $this->flush(); } + private function reobjectify($value) { + return is_object($value) ? unserialize(serialize($value)) : $value; + } + }