core: Add support for custom cache types via config.ini.php
This commit adds support for a new parameter which specifies the type of cache to use for caching. It is specified in config.ini.php: [cache] type = "..." Currently only one type of cache is supported (see /caches). All uses of 'FileCache' were replaced by this configuration option. Note: Caching currently depends on files and folders (due to FileCache). Experience may vary depending on the selected cache type. For now always check if FileCache is working before testing alternative types. References #1000
This commit is contained in:
parent
51ee541d5a
commit
556a417dd6
7 changed files with 85 additions and 5 deletions
|
@ -85,7 +85,7 @@ class DisplayAction extends ActionAbstract {
|
||||||
);
|
);
|
||||||
|
|
||||||
// Initialize cache
|
// Initialize cache
|
||||||
$cache = Cache::create('FileCache');
|
$cache = Cache::create(Configuration::getConfig('cache', 'type'));
|
||||||
$cache->setPath(PATH_CACHE);
|
$cache->setPath(PATH_CACHE);
|
||||||
$cache->purgeCache(86400); // 24 hours
|
$cache->purgeCache(86400); // 24 hours
|
||||||
$cache->setParameters($cache_params);
|
$cache->setParameters($cache_params);
|
||||||
|
|
|
@ -120,7 +120,7 @@ class ElloBridge extends BridgeAbstract {
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getAPIKey() {
|
private function getAPIKey() {
|
||||||
$cache = Cache::create('FileCache');
|
$cache = Cache::create(Configuration::getConfig('cache', 'type'));
|
||||||
$cache->setPath(PATH_CACHE);
|
$cache->setPath(PATH_CACHE);
|
||||||
$cache->setParameters(['key']);
|
$cache->setParameters(['key']);
|
||||||
$key = $cache->loadData();
|
$key = $cache->loadData();
|
||||||
|
|
|
@ -75,7 +75,7 @@ class WordPressPluginUpdateBridge extends BridgeAbstract {
|
||||||
private function getCachedDate($url){
|
private function getCachedDate($url){
|
||||||
Debug::log('getting pubdate from url ' . $url . '');
|
Debug::log('getting pubdate from url ' . $url . '');
|
||||||
// Initialize cache
|
// Initialize cache
|
||||||
$cache = Cache::create('FileCache');
|
$cache = Cache::create(Configuration::getConfig('cache', 'type'));
|
||||||
$cache->setPath(PATH_CACHE . 'pages/');
|
$cache->setPath(PATH_CACHE . 'pages/');
|
||||||
$params = [$url];
|
$params = [$url];
|
||||||
$cache->setParameters($params);
|
$cache->setParameters($params);
|
||||||
|
|
|
@ -6,6 +6,10 @@
|
||||||
|
|
||||||
[cache]
|
[cache]
|
||||||
|
|
||||||
|
; Defines the cache type used by RSS-Bridge
|
||||||
|
; "file" = FileCache (default)
|
||||||
|
type = "file"
|
||||||
|
|
||||||
; Allow users to specify custom timeout for specific requests.
|
; Allow users to specify custom timeout for specific requests.
|
||||||
; true = enabled
|
; true = enabled
|
||||||
; false = disabled (default)
|
; false = disabled (default)
|
||||||
|
|
|
@ -64,6 +64,8 @@ class Cache {
|
||||||
* @return object|bool The cache object or false if the class is not instantiable.
|
* @return object|bool The cache object or false if the class is not instantiable.
|
||||||
*/
|
*/
|
||||||
public static function create($name){
|
public static function create($name){
|
||||||
|
$name = self::sanitizeCacheName($name) . 'Cache';
|
||||||
|
|
||||||
if(!self::isCacheName($name)) {
|
if(!self::isCacheName($name)) {
|
||||||
throw new \InvalidArgumentException('Cache name invalid!');
|
throw new \InvalidArgumentException('Cache name invalid!');
|
||||||
}
|
}
|
||||||
|
@ -137,4 +139,75 @@ class Cache {
|
||||||
public static function isCacheName($name){
|
public static function isCacheName($name){
|
||||||
return is_string($name) && preg_match('/^[A-Z][a-zA-Z0-9-]*$/', $name) === 1;
|
return is_string($name) && preg_match('/^[A-Z][a-zA-Z0-9-]*$/', $name) === 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a list of cache names from the working directory.
|
||||||
|
*
|
||||||
|
* The list is cached internally to allow for successive calls.
|
||||||
|
*
|
||||||
|
* @return array List of cache names
|
||||||
|
*/
|
||||||
|
public static function getCacheNames(){
|
||||||
|
|
||||||
|
static $cacheNames = array(); // Initialized on first call
|
||||||
|
|
||||||
|
if(empty($cacheNames)) {
|
||||||
|
$files = scandir(self::getWorkingDir());
|
||||||
|
|
||||||
|
if($files !== false) {
|
||||||
|
foreach($files as $file) {
|
||||||
|
if(preg_match('/^([^.]+)Cache\.php$/U', $file, $out)) {
|
||||||
|
$cacheNames[] = $out[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $cacheNames;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the sanitized cache name.
|
||||||
|
*
|
||||||
|
* The cache name can be specified in various ways:
|
||||||
|
* * The PHP file name (i.e. `FileCache.php`)
|
||||||
|
* * The PHP file name without file extension (i.e. `FileCache`)
|
||||||
|
* * The cache name (i.e. `file`)
|
||||||
|
*
|
||||||
|
* Casing is ignored (i.e. `FILE` and `fIlE` are the same).
|
||||||
|
*
|
||||||
|
* A cache file matching the given cache name must exist in the working
|
||||||
|
* directory!
|
||||||
|
*
|
||||||
|
* @param string $name The cache name
|
||||||
|
* @return string|null The sanitized cache name if the provided name is
|
||||||
|
* valid, null otherwise.
|
||||||
|
*/
|
||||||
|
protected static function sanitizeCacheName($name) {
|
||||||
|
|
||||||
|
if(is_string($name)) {
|
||||||
|
|
||||||
|
// Trim trailing '.php' if exists
|
||||||
|
if(preg_match('/(.+)(?:\.php)/', $name, $matches)) {
|
||||||
|
$name = $matches[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Trim trailing 'Cache' if exists
|
||||||
|
if(preg_match('/(.+)(?:Cache)/i', $name, $matches)) {
|
||||||
|
$name = $matches[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
// The name is valid if a corresponding file is found on disk
|
||||||
|
if(in_array(strtolower($name), array_map('strtolower', self::getCacheNames()))) {
|
||||||
|
$index = array_search(strtolower($name), array_map('strtolower', self::getCacheNames()));
|
||||||
|
return self::getCacheNames()[$index];
|
||||||
|
}
|
||||||
|
|
||||||
|
Debug::log('Invalid cache name specified: "' . $name . '"!');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return null; // Bad parameter
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -179,6 +179,9 @@ final class Configuration {
|
||||||
/** Name of the proxy server */
|
/** Name of the proxy server */
|
||||||
define('PROXY_NAME', self::getConfig('proxy', 'name'));
|
define('PROXY_NAME', self::getConfig('proxy', 'name'));
|
||||||
|
|
||||||
|
if(!is_string(self::getConfig('cache', 'type')))
|
||||||
|
die('Parameter [cache] => "type" is not a valid string! Please check "config.ini.php"!');
|
||||||
|
|
||||||
if(!is_bool(self::getConfig('cache', 'custom_timeout')))
|
if(!is_bool(self::getConfig('cache', 'custom_timeout')))
|
||||||
die('Parameter [cache] => "custom_timeout" is not a valid Boolean! Please check "config.ini.php"!');
|
die('Parameter [cache] => "custom_timeout" is not a valid Boolean! Please check "config.ini.php"!');
|
||||||
|
|
||||||
|
|
|
@ -45,7 +45,7 @@ function getContents($url, $header = array(), $opts = array()){
|
||||||
Debug::log('Reading contents from "' . $url . '"');
|
Debug::log('Reading contents from "' . $url . '"');
|
||||||
|
|
||||||
// Initialize cache
|
// Initialize cache
|
||||||
$cache = Cache::create('FileCache');
|
$cache = Cache::create(Configuration::getConfig('cache', 'type'));
|
||||||
$cache->setPath(PATH_CACHE . 'server/');
|
$cache->setPath(PATH_CACHE . 'server/');
|
||||||
$cache->purgeCache(86400); // 24 hours (forced)
|
$cache->purgeCache(86400); // 24 hours (forced)
|
||||||
|
|
||||||
|
@ -268,7 +268,7 @@ $defaultSpanText = DEFAULT_SPAN_TEXT){
|
||||||
Debug::log('Caching url ' . $url . ', duration ' . $duration);
|
Debug::log('Caching url ' . $url . ', duration ' . $duration);
|
||||||
|
|
||||||
// Initialize cache
|
// Initialize cache
|
||||||
$cache = Cache::create('FileCache');
|
$cache = Cache::create(Configuration::getConfig('cache', 'type'));
|
||||||
$cache->setPath(PATH_CACHE . 'pages/');
|
$cache->setPath(PATH_CACHE . 'pages/');
|
||||||
$cache->purgeCache(86400); // 24 hours (forced)
|
$cache->purgeCache(86400); // 24 hours (forced)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue