* @var OC_Cache $global_cache | * @var OC_Cache $global_cache | ||||
*/ | */ | ||||
static protected $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 | * get the global cache | ||||
* @return OC_Cache | * @return OC_Cache | ||||
*/ | */ | ||||
static public function getGlobalCache($fast=false) { | |||||
static public function getGlobalCache() { | |||||
if (!self::$global_cache) { | 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(); | 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; | return self::$global_cache; | ||||
} | } | ||||
* get the user cache | * get the user cache | ||||
* @return OC_Cache | * @return OC_Cache | ||||
*/ | */ | ||||
static public function getUserCache($fast=false) { | |||||
static public function getUserCache() { | |||||
if (!self::$user_cache) { | 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(); | 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; | return self::$user_cache; | ||||
} | } | ||||
/** | /** | ||||
* get a value from the user cache | * get a value from the user cache | ||||
* @param string $key | |||||
* @return mixed | * @return mixed | ||||
*/ | */ | ||||
static public function get($key) { | static public function get($key) { | ||||
/** | /** | ||||
* set a value in the user cache | * set a value in the user cache | ||||
* @param string $key | |||||
* @param mixed $value | |||||
* @param int $ttl | |||||
* @return bool | * @return bool | ||||
*/ | */ | ||||
static public function set($key, $value, $ttl=0) { | static public function set($key, $value, $ttl=0) { | ||||
/** | /** | ||||
* check if a value is set in the user cache | * check if a value is set in the user cache | ||||
* @param string $key | |||||
* @return bool | * @return bool | ||||
*/ | */ | ||||
static public function hasKey($key) { | static public function hasKey($key) { | ||||
/** | /** | ||||
* remove an item from the user cache | * remove an item from the user cache | ||||
* @param string $key | |||||
* @return bool | * @return bool | ||||
*/ | */ | ||||
static public function remove($key) { | static public function remove($key) { | ||||
return $user_cache->clear($prefix); | 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) { | static public function generateCacheKeyFromFiles($files) { | ||||
$key = ''; | $key = ''; | ||||
sort($files); | sort($files); |
<?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; | |||||
} | |||||
} |
<?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; | |||||
} | |||||
} |
<?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(); | |||||
} |
* See the COPYING-README file. | * See the COPYING-README file. | ||||
*/ | */ | ||||
class OC_Cache_XCache { | |||||
namespace OC\Memcache; | |||||
class XCache extends Cache { | |||||
protected $prefix; | protected $prefix; | ||||
public function __construct($global = false) { | public function __construct($global = false) { | ||||
$this->prefix = OC_Util::getInstanceId().'/'; | |||||
$this->prefix = \OC_Util::getInstanceId().'/'; | |||||
if (!$global) { | if (!$global) { | ||||
$this->prefix .= OC_User::getUser().'/'; | |||||
$this->prefix .= \OC_User::getUser().'/'; | |||||
} | } | ||||
} | } | ||||
} | } | ||||
public function clear($prefix='') { | 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); | xcache_unset_by_prefix($this->getNamespace().$prefix); | ||||
return true; | 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); | |||||
} | |||||
} | } |
<?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(); | |||||
} | |||||
} |
* | * | ||||
*/ | */ | ||||
class Test_Cache_XCache extends Test_Cache { | |||||
class Test_Memcache_APC extends Test_Cache { | |||||
public function setUp() { | 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; | return; | ||||
} | } | ||||
$this->instance=new OC_Cache_XCache(); | |||||
$this->instance=new \OC\Memcache\APC(); | |||||
} | } | ||||
} | } |
<?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(); | |||||
} | |||||
} |