diff options
Diffstat (limited to 'app')
-rw-r--r-- | app/Core/Base.php | 1 | ||||
-rw-r--r-- | app/Core/Cache/Base.php | 38 | ||||
-rw-r--r-- | app/Core/Cache/BaseCache.php | 71 | ||||
-rw-r--r-- | app/Core/Cache/CacheInterface.php | 45 | ||||
-rw-r--r-- | app/Core/Cache/FileCache.php | 98 | ||||
-rw-r--r-- | app/Core/Cache/MemoryCache.php | 10 | ||||
-rw-r--r-- | app/Core/Plugin/Installer.php | 27 | ||||
-rw-r--r-- | app/Core/Tool.php | 28 | ||||
-rw-r--r-- | app/ServiceProvider/CacheProvider.php | 41 | ||||
-rw-r--r-- | app/ServiceProvider/ClassProvider.php | 3 | ||||
-rw-r--r-- | app/common.php | 1 | ||||
-rw-r--r-- | app/constants.php | 6 |
12 files changed, 253 insertions, 116 deletions
diff --git a/app/Core/Base.php b/app/Core/Base.php index 68604785..df82febd 100644 --- a/app/Core/Base.php +++ b/app/Core/Base.php @@ -18,6 +18,7 @@ use Pimple\Container; * @property \Kanboard\Core\Action\ActionManager $actionManager * @property \Kanboard\Core\ExternalLink\ExternalLinkManager $externalLinkManager * @property \Kanboard\Core\Cache\MemoryCache $memoryCache + * @property \Kanboard\Core\Cache\BaseCache $cacheDriver * @property \Kanboard\Core\Event\EventManager $eventManager * @property \Kanboard\Core\Group\GroupManager $groupManager * @property \Kanboard\Core\Http\Client $httpClient diff --git a/app/Core/Cache/Base.php b/app/Core/Cache/Base.php deleted file mode 100644 index d62b8507..00000000 --- a/app/Core/Cache/Base.php +++ /dev/null @@ -1,38 +0,0 @@ -<?php - -namespace Kanboard\Core\Cache; - -/** - * Base class for cache drivers - * - * @package cache - * @author Frederic Guillot - */ -abstract class Base -{ - /** - * Proxy cache - * - * Note: Arguments must be scalar types - * - * @access public - * @param string $class Class instance - * @param string $method Container method - * @return mixed - */ - public function proxy($class, $method) - { - $args = func_get_args(); - array_shift($args); - - $key = 'proxy:'.get_class($class).':'.implode(':', $args); - $result = $this->get($key); - - if ($result === null) { - $result = call_user_func_array(array($class, $method), array_splice($args, 1)); - $this->set($key, $result); - } - - return $result; - } -} diff --git a/app/Core/Cache/BaseCache.php b/app/Core/Cache/BaseCache.php new file mode 100644 index 00000000..04f8d220 --- /dev/null +++ b/app/Core/Cache/BaseCache.php @@ -0,0 +1,71 @@ +<?php + +namespace Kanboard\Core\Cache; + +/** + * Base Class for Cache Drivers + * + * @package Kanboard\Core\Cache + * @author Frederic Guillot + */ +abstract class BaseCache +{ + /** + * Store an item in the cache + * + * @access public + * @param string $key + * @param string $value + */ + abstract public function set($key, $value); + + /** + * Retrieve an item from the cache by key + * + * @access public + * @param string $key + * @return mixed Null when not found, cached value otherwise + */ + abstract public function get($key); + + /** + * Remove all items from the cache + * + * @access public + */ + abstract public function flush(); + + /** + * Remove an item from the cache + * + * @access public + * @param string $key + */ + abstract public function remove($key); + + /** + * Proxy cache + * + * Note: Arguments must be scalar types + * + * @access public + * @param string $class Class instance + * @param string $method Container method + * @return mixed + */ + public function proxy($class, $method) + { + $args = func_get_args(); + array_shift($args); + + $key = 'proxy:'.get_class($class).':'.implode(':', $args); + $result = $this->get($key); + + if ($result === null) { + $result = call_user_func_array(array($class, $method), array_splice($args, 1)); + $this->set($key, $result); + } + + return $result; + } +} diff --git a/app/Core/Cache/CacheInterface.php b/app/Core/Cache/CacheInterface.php deleted file mode 100644 index d9e9747a..00000000 --- a/app/Core/Cache/CacheInterface.php +++ /dev/null @@ -1,45 +0,0 @@ -<?php - -namespace Kanboard\Core\Cache; - -/** - * Cache Interface - * - * @package cache - * @author Frederic Guillot - */ -interface CacheInterface -{ - /** - * Save a new value in the cache - * - * @access public - * @param string $key - * @param string $value - */ - public function set($key, $value); - - /** - * Fetch value from cache - * - * @access public - * @param string $key - * @return mixed Null when not found, cached value otherwise - */ - public function get($key); - - /** - * Clear all cache - * - * @access public - */ - public function flush(); - - /** - * Remove cached value - * - * @access public - * @param string $key - */ - public function remove($key); -} diff --git a/app/Core/Cache/FileCache.php b/app/Core/Cache/FileCache.php new file mode 100644 index 00000000..d477a1f3 --- /dev/null +++ b/app/Core/Cache/FileCache.php @@ -0,0 +1,98 @@ +<?php + +namespace Kanboard\Core\Cache; + +use Kanboard\Core\Tool; +use LogicException; + +/** + * Class FileCache + * + * @package Kanboard\Core\Cache + */ +class FileCache extends BaseCache +{ + /** + * Store an item in the cache + * + * @access public + * @param string $key + * @param string $value + */ + public function set($key, $value) + { + $this->createCacheFolder(); + file_put_contents($this->getFilenameFromKey($key), serialize($value)); + } + + /** + * Retrieve an item from the cache by key + * + * @access public + * @param string $key + * @return mixed Null when not found, cached value otherwise + */ + public function get($key) + { + $filename = $this->getFilenameFromKey($key); + + if (file_exists($filename)) { + return unserialize(file_get_contents($filename)); + } + + return null; + } + + /** + * Remove all items from the cache + * + * @access public + */ + public function flush() + { + $this->createCacheFolder(); + Tool::removeAllFiles(CACHE_DIR, false); + } + + /** + * Remove an item from the cache + * + * @access public + * @param string $key + */ + public function remove($key) + { + $filename = $this->getFilenameFromKey($key); + + if (file_exists($filename)) { + unlink($filename); + } + } + + /** + * Get absolute filename from the key + * + * @access protected + * @param string $key + * @return string + */ + protected function getFilenameFromKey($key) + { + return CACHE_DIR.DIRECTORY_SEPARATOR.$key; + } + + /** + * Create cache folder if missing + * + * @access protected + * @throws LogicException + */ + protected function createCacheFolder() + { + if (! is_dir(CACHE_DIR)) { + if (! mkdir(CACHE_DIR, 0755)) { + throw new LogicException('Unable to create cache directory: '.CACHE_DIR); + } + } + } +} diff --git a/app/Core/Cache/MemoryCache.php b/app/Core/Cache/MemoryCache.php index 39e3947b..4fb94728 100644 --- a/app/Core/Cache/MemoryCache.php +++ b/app/Core/Cache/MemoryCache.php @@ -3,12 +3,12 @@ namespace Kanboard\Core\Cache; /** - * Memory Cache + * Memory Cache Driver * - * @package cache + * @package Kanboard\Core\Cache * @author Frederic Guillot */ -class MemoryCache extends Base implements CacheInterface +class MemoryCache extends BaseCache { /** * Container @@ -19,7 +19,7 @@ class MemoryCache extends Base implements CacheInterface private $storage = array(); /** - * Save a new value in the cache + * Store an item in the cache * * @access public * @param string $key @@ -31,7 +31,7 @@ class MemoryCache extends Base implements CacheInterface } /** - * Fetch value from cache + * Retrieve an item from the cache by key * * @access public * @param string $key diff --git a/app/Core/Plugin/Installer.php b/app/Core/Plugin/Installer.php index 48c4d978..b3618aeb 100644 --- a/app/Core/Plugin/Installer.php +++ b/app/Core/Plugin/Installer.php @@ -2,9 +2,8 @@ namespace Kanboard\Core\Plugin; -use RecursiveDirectoryIterator; -use RecursiveIteratorIterator; use ZipArchive; +use Kanboard\Core\Tool; /** * Class Installer @@ -64,7 +63,7 @@ class Installer extends \Kanboard\Core\Base throw new PluginInstallerException(e('You don\'t have the permission to remove this plugin.')); } - $this->removeAllDirectories($pluginFolder); + Tool::removeAllFiles($pluginFolder); } /** @@ -137,26 +136,4 @@ class Installer extends \Kanboard\Core\Base unlink($zip->filename); $zip->close(); } - - /** - * Remove recursively a directory - * - * @access protected - * @param string $directory - */ - protected function removeAllDirectories($directory) - { - $it = new RecursiveDirectoryIterator($directory, RecursiveDirectoryIterator::SKIP_DOTS); - $files = new RecursiveIteratorIterator($it, RecursiveIteratorIterator::CHILD_FIRST); - - foreach ($files as $file) { - if ($file->isDir()) { - rmdir($file->getRealPath()); - } else { - unlink($file->getRealPath()); - } - } - - rmdir($directory); - } } diff --git a/app/Core/Tool.php b/app/Core/Tool.php index bfa6c955..9b8820eb 100644 --- a/app/Core/Tool.php +++ b/app/Core/Tool.php @@ -3,6 +3,8 @@ namespace Kanboard\Core; use Pimple\Container; +use RecursiveDirectoryIterator; +use RecursiveIteratorIterator; /** * Tool class @@ -13,6 +15,32 @@ use Pimple\Container; class Tool { /** + * Remove recursively a directory + * + * @static + * @access public + * @param string $directory + * @param bool $removeDirectory + */ + public static function removeAllFiles($directory, $removeDirectory = true) + { + $it = new RecursiveDirectoryIterator($directory, RecursiveDirectoryIterator::SKIP_DOTS); + $files = new RecursiveIteratorIterator($it, RecursiveIteratorIterator::CHILD_FIRST); + + foreach ($files as $file) { + if ($file->isDir()) { + rmdir($file->getRealPath()); + } else { + unlink($file->getRealPath()); + } + } + + if ($removeDirectory) { + rmdir($directory); + } + } + + /** * Build dependency injection container from an array * * @static diff --git a/app/ServiceProvider/CacheProvider.php b/app/ServiceProvider/CacheProvider.php new file mode 100644 index 00000000..0d56e601 --- /dev/null +++ b/app/ServiceProvider/CacheProvider.php @@ -0,0 +1,41 @@ +<?php + +namespace Kanboard\ServiceProvider; + +use Kanboard\Core\Cache\FileCache; +use Kanboard\Core\Cache\MemoryCache; +use Pimple\Container; +use Pimple\ServiceProviderInterface; + +/** + * Cache Provider + * + * @package Kanboard\ServiceProvider + * @author Frederic Guillot + */ +class CacheProvider implements ServiceProviderInterface +{ + /** + * Register providers + * + * @access public + * @param \Pimple\Container $container + * @return \Pimple\Container + */ + public function register(Container $container) + { + $container['memoryCache'] = function() { + return new MemoryCache(); + }; + + if (CACHE_DRIVER === 'file') { + $container['cacheDriver'] = function() { + return new FileCache(); + }; + } else { + $container['cacheDriver'] = $container['memoryCache']; + } + + return $container; + } +} diff --git a/app/ServiceProvider/ClassProvider.php b/app/ServiceProvider/ClassProvider.php index aab41c74..d837500a 100644 --- a/app/ServiceProvider/ClassProvider.php +++ b/app/ServiceProvider/ClassProvider.php @@ -140,9 +140,6 @@ class ClassProvider implements ServiceProviderInterface 'Response', 'RememberMeCookie', ), - 'Core\Cache' => array( - 'MemoryCache', - ), 'Core\Plugin' => array( 'Hook', ), diff --git a/app/common.php b/app/common.php index 15fd7a75..e5490c11 100644 --- a/app/common.php +++ b/app/common.php @@ -35,6 +35,7 @@ $container->register(new Kanboard\ServiceProvider\MailProvider()); $container->register(new Kanboard\ServiceProvider\HelperProvider()); $container->register(new Kanboard\ServiceProvider\SessionProvider()); $container->register(new Kanboard\ServiceProvider\LoggingProvider()); +$container->register(new Kanboard\ServiceProvider\CacheProvider()); $container->register(new Kanboard\ServiceProvider\DatabaseProvider()); $container->register(new Kanboard\ServiceProvider\AuthenticationProvider()); $container->register(new Kanboard\ServiceProvider\NotificationProvider()); diff --git a/app/constants.php b/app/constants.php index 40b88fe9..3adb0835 100644 --- a/app/constants.php +++ b/app/constants.php @@ -12,6 +12,12 @@ defined('DATA_DIR') or define('DATA_DIR', ROOT_DIR.DIRECTORY_SEPARATOR.'data'); // Files directory (attachments) defined('FILES_DIR') or define('FILES_DIR', DATA_DIR.DIRECTORY_SEPARATOR.'files'); +// Available cache drivers are "file" and "memory" +defined('CACHE_DRIVER') or define('CACHE_DRIVER', 'memory'); + +// Cache folder (file driver) +defined('CACHE_DIR') or define('CACHE_DIR', DATA_DIR.DIRECTORY_SEPARATOR.'cache'); + // Plugins settings defined('PLUGINS_DIR') or define('PLUGINS_DIR', ROOT_DIR.DIRECTORY_SEPARATOR.'plugins'); defined('PLUGIN_API_URL') or define('PLUGIN_API_URL', 'https://kanboard.net/plugins.json'); |