first commit
This commit is contained in:
+171
@@ -0,0 +1,171 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file classes/cache/CacheManager.php
|
||||
*
|
||||
* Copyright (c) 2014-2021 Simon Fraser University
|
||||
* Copyright (c) 2000-2021 John Willinsky
|
||||
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
|
||||
*
|
||||
* @ingroup cache
|
||||
*
|
||||
* @see GenericCache
|
||||
*
|
||||
* @brief Provides cache management functions.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace PKP\cache;
|
||||
|
||||
use PKP\config\Config;
|
||||
use PKP\core\Core;
|
||||
use PKP\core\Registry;
|
||||
|
||||
define('CACHE_TYPE_FILE', 1);
|
||||
define('CACHE_TYPE_OBJECT', 2);
|
||||
|
||||
class CacheManager
|
||||
{
|
||||
/**
|
||||
* Get the static instance of the cache manager.
|
||||
*
|
||||
* @return CacheManager
|
||||
*/
|
||||
public static function getManager()
|
||||
{
|
||||
$manager = & Registry::get('cacheManager', true, null);
|
||||
if ($manager === null) {
|
||||
$manager = new CacheManager();
|
||||
}
|
||||
return $manager;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a file cache.
|
||||
*
|
||||
* @param string $context
|
||||
* @param string $cacheId
|
||||
* @param callable $fallback
|
||||
*
|
||||
* @return FileCache
|
||||
*/
|
||||
public function getFileCache($context, $cacheId, $fallback)
|
||||
{
|
||||
return new FileCache(
|
||||
$context,
|
||||
$cacheId,
|
||||
$fallback,
|
||||
$this->getFileCachePath()
|
||||
);
|
||||
}
|
||||
|
||||
public function getObjectCache($context, $cacheId, $fallback)
|
||||
{
|
||||
return $this->getCache($context, $cacheId, $fallback, CACHE_TYPE_OBJECT);
|
||||
}
|
||||
|
||||
public function getCacheImplementation($type)
|
||||
{
|
||||
switch ($type) {
|
||||
case CACHE_TYPE_FILE: return 'file';
|
||||
case CACHE_TYPE_OBJECT: return Config::getVar('cache', 'object_cache');
|
||||
default: return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a cache.
|
||||
*
|
||||
* @param string $context
|
||||
* @param string $cacheId
|
||||
* @param ?callable $fallback
|
||||
* @param string $type Type of cache: CACHE_TYPE_...
|
||||
*
|
||||
* @return GenericCache
|
||||
*/
|
||||
public function getCache($context, $cacheId, $fallback, $type = CACHE_TYPE_FILE)
|
||||
{
|
||||
switch ($this->getCacheImplementation($type)) {
|
||||
case 'xcache':
|
||||
$cache = new \PKP\cache\XCacheCache(
|
||||
$context,
|
||||
$cacheId,
|
||||
$fallback
|
||||
);
|
||||
break;
|
||||
case 'apc':
|
||||
$cache = new \PKP\cache\APCCache(
|
||||
$context,
|
||||
$cacheId,
|
||||
$fallback
|
||||
);
|
||||
break;
|
||||
case 'memcache':
|
||||
$cache = new \PKP\cache\MemcacheCache(
|
||||
$context,
|
||||
$cacheId,
|
||||
$fallback,
|
||||
Config::getVar('cache', 'memcache_hostname'),
|
||||
Config::getVar('cache', 'memcache_port')
|
||||
);
|
||||
break;
|
||||
case '': // Provide a default if not specified
|
||||
case 'file':
|
||||
$cache = $this->getFileCache($context, $cacheId, $fallback);
|
||||
break;
|
||||
case 'none':
|
||||
$cache = new \PKP\cache\GenericCache(
|
||||
$context,
|
||||
$cacheId,
|
||||
$fallback
|
||||
);
|
||||
break;
|
||||
default:
|
||||
exit("Unknown cache type \"{$type}\"!\n");
|
||||
}
|
||||
return $cache;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the path in which file caches will be stored.
|
||||
*
|
||||
* @return string The full path to the file cache directory
|
||||
*/
|
||||
public static function getFileCachePath()
|
||||
{
|
||||
return Core::getBaseDir() . '/cache';
|
||||
}
|
||||
|
||||
/**
|
||||
* Flush an entire context, if specified, or
|
||||
* the whole cache.
|
||||
*
|
||||
* @param string $context The context to flush, if only one is to be flushed
|
||||
* @param string $type The type of cache to flush
|
||||
*/
|
||||
public function flush($context = null, $type = CACHE_TYPE_FILE)
|
||||
{
|
||||
$cacheImplementation = $this->getCacheImplementation($type);
|
||||
switch ($cacheImplementation) {
|
||||
case 'xcache':
|
||||
case 'apc':
|
||||
case 'memcache':
|
||||
$junkCache = $this->getCache($context, null, null);
|
||||
$junkCache->flush();
|
||||
break;
|
||||
case 'file':
|
||||
$filePath = $this->getFileCachePath();
|
||||
$files = glob("{$filePath}/fc-" . (isset($context) ? $context . '-' : '') . '*.php');
|
||||
foreach ($files as $file) {
|
||||
@unlink($file);
|
||||
}
|
||||
break;
|
||||
case '':
|
||||
case 'none':
|
||||
// Nothing necessary.
|
||||
break;
|
||||
default:
|
||||
exit("Unknown cache type \"{$type}\"!\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user