Browse Source

Seperate memory based cache from OC_Cache

tags/v6.0.0alpha2
Robin Appelman 11 years ago
parent
commit
80a3f8d066

+ 8
- 59
lib/cache.php View File

@@ -15,41 +15,14 @@ class OC_Cache {
* @var OC_Cache $global_cache
*/
static protected $global_cache;
/**
* @var OC_Cache $global_cache_fast
*/
static protected $global_cache_fast;
/**
* @var OC_Cache $user_cache_fast
*/
static protected $user_cache_fast;
static protected $isFast=null;

/**
* get the global cache
* @return OC_Cache
*/
static public function getGlobalCache($fast=false) {
static public function getGlobalCache() {
if (!self::$global_cache) {
self::$global_cache_fast = null;
if (!self::$global_cache_fast && function_exists('xcache_set')) {
self::$global_cache_fast = new OC_Cache_XCache(true);
}
if (!self::$global_cache_fast && function_exists('apc_store')) {
self::$global_cache_fast = new OC_Cache_APC(true);
}

self::$global_cache = new OC_Cache_FileGlobal();
if (self::$global_cache_fast) {
self::$global_cache = new OC_Cache_Broker(self::$global_cache_fast, self::$global_cache);
}
}
if($fast) {
if(self::$global_cache_fast) {
return self::$global_cache_fast;
}else{
return false;
}
}
return self::$global_cache;
}
@@ -58,34 +31,16 @@ class OC_Cache {
* get the user cache
* @return OC_Cache
*/
static public function getUserCache($fast=false) {
static public function getUserCache() {
if (!self::$user_cache) {
self::$user_cache_fast = null;
if (!self::$user_cache_fast && function_exists('xcache_set')) {
self::$user_cache_fast = new OC_Cache_XCache();
}
if (!self::$user_cache_fast && function_exists('apc_store')) {
self::$user_cache_fast = new OC_Cache_APC();
}

self::$user_cache = new OC_Cache_File();
if (self::$user_cache_fast) {
self::$user_cache = new OC_Cache_Broker(self::$user_cache_fast, self::$user_cache);
}
}

if($fast) {
if(self::$user_cache_fast) {
return self::$user_cache_fast;
}else{
return false;
}
}
return self::$user_cache;
}

/**
* get a value from the user cache
* @param string $key
* @return mixed
*/
static public function get($key) {
@@ -95,6 +50,9 @@ class OC_Cache {

/**
* set a value in the user cache
* @param string $key
* @param mixed $value
* @param int $ttl
* @return bool
*/
static public function set($key, $value, $ttl=0) {
@@ -107,6 +65,7 @@ class OC_Cache {

/**
* check if a value is set in the user cache
* @param string $key
* @return bool
*/
static public function hasKey($key) {
@@ -116,6 +75,7 @@ class OC_Cache {

/**
* remove an item from the user cache
* @param string $key
* @return bool
*/
static public function remove($key) {
@@ -133,17 +93,6 @@ class OC_Cache {
return $user_cache->clear($prefix);
}

/**
* check if a fast memory based cache is available
* @return true
*/
static public function isFast() {
if(is_null(self::$isFast)) {
self::$isFast=function_exists('xcache_set') || function_exists('apc_store');
}
return self::$isFast;
}

static public function generateCacheKeyFromFiles($files) {
$key = '';
sort($files);

+ 0
- 64
lib/cache/apc.php View File

@@ -1,64 +0,0 @@
<?php
/**
* Copyright (c) 2012 Bart Visscher <bartv@thisnet.nl>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/

class OC_Cache_APC {
protected $prefix;

public function __construct($global = false) {
$this->prefix = OC_Util::getInstanceId().'/';
if (!$global) {
$this->prefix .= OC_User::getUser().'/';
}
}

/**
* entries in APC gets namespaced to prevent collisions between owncloud instances and users
*/
protected function getNameSpace() {
return $this->prefix;
}

public function get($key) {
$result = apc_fetch($this->getNamespace().$key, $success);
if (!$success) {
return null;
}
return $result;
}

public function set($key, $value, $ttl=0) {
return apc_store($this->getNamespace().$key, $value, $ttl);
}

public function hasKey($key) {
return apc_exists($this->getNamespace().$key);
}

public function remove($key) {
return apc_delete($this->getNamespace().$key);
}

public function clear($prefix='') {
$ns = $this->getNamespace().$prefix;
$cache = apc_cache_info('user');
foreach($cache['cache_list'] as $entry) {
if (strpos($entry['info'], $ns) === 0) {
apc_delete($entry['info']);
}
}
return true;
}
}
if(!function_exists('apc_exists')) {
function apc_exists($keys)
{
$result=false;
apc_fetch($keys, $result);
return $result;
}
}

+ 76
- 0
lib/memcache/apc.php View File

@@ -0,0 +1,76 @@
<?php
/**
* Copyright (c) 2012 Bart Visscher <bartv@thisnet.nl>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/

namespace OC\Memcache;

class APC extends Cache {
protected $prefix;

public function __construct($global = false) {
$this->prefix = \OC_Util::getInstanceId() . '/';
if (!$global) {
$this->prefix .= \OC_User::getUser() . '/';
}
}

/**
* entries in APC gets namespaced to prevent collisions between owncloud instances and users
*/
protected function getNameSpace() {
return $this->prefix;
}

public function get($key) {
$result = apc_fetch($this->getNamespace() . $key, $success);
if (!$success) {
return null;
}
return $result;
}

public function set($key, $value, $ttl = 0) {
return apc_store($this->getNamespace() . $key, $value, $ttl);
}

public function hasKey($key) {
return apc_exists($this->getNamespace() . $key);
}

public function remove($key) {
return apc_delete($this->getNamespace() . $key);
}

public function clear($prefix = '') {
$ns = $this->getNamespace() . $prefix;
$cache = apc_cache_info('user');
foreach ($cache['cache_list'] as $entry) {
if (strpos($entry['info'], $ns) === 0) {
apc_delete($entry['info']);
}
}
return true;
}

static public function isAvailable() {
if (!extension_loaded('apc')) {
return false;
} elseif (!ini_get('apc.enable_cli') && \OC::$CLI) {
return false;
}else{
return true;
}
}
}

if (!function_exists('apc_exists')) {
function apc_exists($keys) {
$result = false;
apc_fetch($keys, $result);
return $result;
}
}

+ 69
- 0
lib/memcache/cache.php View File

@@ -0,0 +1,69 @@
<?php
/**
* Copyright (c) 2013 Robin Appelman <icewind@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/

namespace OC\Memcache;

abstract class Cache {
/**
* get a cache instance
*
* @param bool $global
* @return Cache
*/
static function create($global = false) {
if (XCache::isAvailable()) {
return new XCache($global);
} elseif (APC::isAvailable()) {
return new APC($global);
} else {
return null;
}
}

/**
* @param bool $global
*/
abstract public function __construct($global);

/**
* @param string $key
* @return mixed
*/
abstract public function get($key);

/**
* @param string $key
* @param mixed $value
* @param int $ttl
* @return mixed
*/
abstract public function set($key, $value, $ttl = 0);

/**
* @param string $key
* @return mixed
*/
abstract public function hasKey($key);

/**
* @param string $key
* @return mixed
*/
abstract public function remove($key);

/**
* @param string $prefix
* @return mixed
*/
abstract public function clear($prefix = '');

/**
* @return bool
*/
//static public function isAvailable();
}

lib/cache/xcache.php → lib/memcache/xcache.php View File

@@ -6,13 +6,15 @@
* See the COPYING-README file.
*/

class OC_Cache_XCache {
namespace OC\Memcache;

class XCache extends Cache {
protected $prefix;

public function __construct($global = false) {
$this->prefix = OC_Util::getInstanceId().'/';
$this->prefix = \OC_Util::getInstanceId().'/';
if (!$global) {
$this->prefix .= OC_User::getUser().'/';
$this->prefix .= \OC_User::getUser().'/';
}
}

@@ -44,13 +46,24 @@ class OC_Cache_XCache {
}

public function clear($prefix='') {
if(!function_exists('xcache_unset_by_prefix')) {
function xcache_unset_by_prefix($prefix) {
// Since we can't clear targetted cache, we'll clear all. :(
xcache_clear_cache(XC_TYPE_VAR, 0);
}
}
xcache_unset_by_prefix($this->getNamespace().$prefix);
return true;
}

static public function isAvailable(){
if (!extension_loaded('xcache')) {
return false;
} elseif (\OC::$CLI) {
return false;
}else{
return true;
}
}
}

if(!function_exists('xcache_unset_by_prefix')) {
function xcache_unset_by_prefix($prefix) {
// Since we can't clear targetted cache, we'll clear all. :(
xcache_clear_cache(\XC_TYPE_VAR, 0);
}
}

+ 0
- 35
tests/lib/cache/apc.php View File

@@ -1,35 +0,0 @@
<?php
/**
* ownCloud
*
* @author Robin Appelman
* @copyright 2012 Robin Appelman icewind@owncloud.com
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/

class Test_Cache_APC extends Test_Cache {
public function setUp() {
if(!extension_loaded('apc')) {
$this->markTestSkipped('The apc extension is not available.');
return;
}
if(!ini_get('apc.enable_cli') && OC::$CLI) {
$this->markTestSkipped('apc not available in CLI.');
return;
}
$this->instance=new OC_Cache_APC();
}
}

tests/lib/cache/xcache.php → tests/lib/memcache/apc.php View File

@@ -20,12 +20,12 @@
*
*/

class Test_Cache_XCache extends Test_Cache {
class Test_Memcache_APC extends Test_Cache {
public function setUp() {
if(!function_exists('xcache_get')) {
$this->markTestSkipped('The xcache extension is not available.');
if(!\OC\Memcache\APC::isAvailable()) {
$this->markTestSkipped('The apc extension is not available.');
return;
}
$this->instance=new OC_Cache_XCache();
$this->instance=new \OC\Memcache\APC();
}
}

+ 31
- 0
tests/lib/memcache/xcache.php View File

@@ -0,0 +1,31 @@
<?php
/**
* ownCloud
*
* @author Robin Appelman
* @copyright 2012 Robin Appelman icewind@owncloud.com
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/

class Test_Memcache_XCache extends Test_Cache {
public function setUp() {
if (!\OC\Memcache\XCache::isAvailable()) {
$this->markTestSkipped('The xcache extension is not available.');
return;
}
$this->instance = new \OC\Memcache\XCache();
}
}

Loading…
Cancel
Save