_timeout = intval($config['timeout']); } if (isset($config['prefix'])) { $this->_prefix = $config['prefix']; } } /** * @param $key * @param $value * @param null|int|\DateInterval $ttl * * @return bool */ 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; } /** * @param $key * @param mixed $default * * @return mixed */ 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; } /** * @param $key * * @return bool|string[] */ public function delete($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; // 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($name); } } return TRUE; } public function clear() { return $this->flush(); } private function reobjectify($value) { return is_object($value) ? unserialize(serialize($value)) : $value; } }