diff --git a/src/Core/Console.php b/src/Core/Console.php index 29ccd795b8..9edc12b64c 100644 --- a/src/Core/Console.php +++ b/src/Core/Console.php @@ -14,6 +14,7 @@ class Console extends \Asika\SimpleConsole\Console protected $customHelpOptions = ['h', 'help', '?']; protected $subConsoles = [ + 'cache' => __NAMESPACE__ . '\Console\Cache', 'config' => __NAMESPACE__ . '\Console\Config', 'createdoxygen' => __NAMESPACE__ . '\Console\CreateDoxygen', 'docbloxerrorchecker' => __NAMESPACE__ . '\Console\DocBloxErrorChecker', @@ -37,6 +38,7 @@ class Console extends \Asika\SimpleConsole\Console Usage: bin/console [--version] [-h|--help|-?] [] [-v] Commands: + cache Manage node cache config Edit site config createdoxygen Generate Doxygen headers dbstructure Do database updates diff --git a/src/Core/Console/Cache.php b/src/Core/Console/Cache.php new file mode 100644 index 0000000000..d0bc427dee --- /dev/null +++ b/src/Core/Console/Cache.php @@ -0,0 +1,180 @@ + + */ +class Cache extends \Asika\SimpleConsole\Console +{ + protected $helpOptions = ['h', 'help', '?']; + + protected function getHelp() + { + $help = << [-h|--help|-?] [-v] + bin/console cache set [-h|--help|-?] [-v] + bin/console cache flush [-h|--help|-?] [-v] + bin/console cache clear [-h|--help|-?] [-v] + +Description + bin/console cache list [] + List all cache keys, optionally filtered by a prefix + + bin/console cache get + Shows the value of the provided cache key + + bin/console cache set [] + Sets the value of the provided cache key, optionally with the provided TTL (time to live) with a default of five minutes. + + bin/console cache flush + Clears expired cache keys + + bin/console cache clear + Clears all cache keys + +Options + -h|--help|-? Show help information + -v Show more debug information. +HELP; + return $help; + } + + protected function doExecute() + { + $a = \Friendica\BaseObject::getApp(); + + if ($this->getOption('v')) { + $this->out('Executable: ' . $this->executable); + $this->out('Class: ' . __CLASS__); + $this->out('Arguments: ' . var_export($this->args, true)); + $this->out('Options: ' . var_export($this->options, true)); + } + + if (!($a->mode & App::MODE_DBCONFIGAVAILABLE)) { + $this->out('Database isn\'t ready or populated yet, database cache won\'t be available'); + } + + Core\Cache::init(); + + if ($this->getOption('v')) { + $this->out('Cache Driver Name: ' . Core\Cache::$driver_name); + $this->out('Cache Driver Class: ' . Core\Cache::$driver_class); + } + + switch ($this->getArgument(0)) { + case 'list': + $this->executeList(); + break; + case 'get': + $this->executeGet(); + break; + case 'set': + $this->executeSet(); + break; + case 'flush': + $this->executeFlush(); + break; + case 'clear': + $this->executeClear(); + break; + } + + if (count($this->args) == 0) { + $this->out($this->getHelp()); + return 0; + } + + return 0; + } + + private function executeList() + { + $prefix = $this->getArgument(1); + $keys = Core\Cache::getAllKeys(); + + if (empty($prefix)) { + $this->out('Listing all cache keys:'); + } else { + $this->out('Listing all cache keys starting with "' . $prefix . '":'); + } + + $count = 0; + foreach ($keys as $key) { + if (empty($prefix) || strpos($key, $prefix) === 0) { + $this->out($key); + $count++; + } + } + + $this->out($count . ' keys found'); + } + + private function executeGet() + { + if (count($this->args) >= 2) { + $key = $this->getArgument(1); + $value = Core\Cache::get($key); + + $this->out("{$key} => " . var_export($value, true)); + } else { + throw new CommandArgsException('Too few arguments for get'); + } + } + + private function executeSet() + { + if (count($this->args) >= 3) { + $key = $this->getArgument(1); + $value = $this->getArgument(2); + $duration = intval($this->getArgument(3, Core\Cache::FIVE_MINUTES)); + + if (is_array(Core\Cache::get($key))) { + throw new RuntimeException("$key is an array and can't be set using this command."); + } + + $result = Core\Cache::set($key, $value, $duration); + if ($result) { + $this->out("{$key} <= " . Core\Cache::get($key)); + } else { + $this->out("Unable to set {$key}"); + } + } else { + throw new CommandArgsException('Too few arguments for set'); + } + } + + private function executeFlush() + { + $result = Core\Cache::clear(); + if ($result) { + $this->out('Cache successfully flushed'); + } else { + $this->out('Unable to flush the cache'); + } + } + + private function executeClear() + { + $result = Core\Cache::clear(false); + if ($result) { + $this->out('Cache successfully cleared'); + } else { + $this->out('Unable to flush the cache'); + } + } +}