. * */ namespace Friendica\Core\Cache\Factory; use Friendica\App\BaseURL; use Friendica\Core\Cache\Enum; use Friendica\Core\Cache\Capability\ICanCache; use Friendica\Core\Cache\Exception\CachePersistenceException; use Friendica\Core\Cache\Exception\InvalidCacheDriverException; use Friendica\Core\Cache\Type; use Friendica\Core\Config\Capability\IManageConfigValues; use Friendica\Database\Database; use Friendica\Util\Profiler; use Psr\Log\LoggerInterface; /** * Class CacheFactory * * @package Friendica\Core\Cache * * A basic class to generate a CacheDriver */ class Cache { /** * @var string The default cache if nothing set */ const DEFAULT_TYPE = Enum\Type::DATABASE; /** * @var IManageConfigValues The IConfiguration to read parameters out of the config */ private $config; /** * @var Database The database connection in case that the cache is used the dba connection */ private $dba; /** * @var string The hostname, used as Prefix for Caching */ private $hostname; /** * @var Profiler The optional profiler if the cached should be profiled */ private $profiler; /** * @var LoggerInterface The Friendica Logger */ private $logger; public function __construct(BaseURL $baseURL, IManageConfigValues $config, Database $dba, Profiler $profiler, LoggerInterface $logger) { $this->hostname = $baseURL->getHostname(); $this->config = $config; $this->dba = $dba; $this->profiler = $profiler; $this->logger = $logger; } /** * This method creates a CacheDriver for the given cache driver name * * @param string|null $type The cache type to create (default is per config) * * @return ICanCache The instance of the CacheDriver * * @throws InvalidCacheDriverException In case the underlying cache driver isn't valid or not configured properly * @throws CachePersistenceException In case the underlying cache has errors during persistence */ public function create(string $type = null): ICanCache { if (empty($type)) { $type = $this->config->get('system', 'cache_driver', self::DEFAULT_TYPE); } switch ($type) { case Enum\Type::MEMCACHE: $cache = new Type\MemcacheCache($this->hostname, $this->config); break; case Enum\Type::MEMCACHED: $cache = new Type\MemcachedCache($this->hostname, $this->config, $this->logger); break; case Enum\Type::REDIS: $cache = new Type\RedisCache($this->hostname, $this->config); break; case Enum\Type::APCU: $cache = new Type\APCuCache($this->hostname); break; default: $cache = new Type\DatabaseCache($this->hostname, $this->dba); } $profiling = $this->config->get('system', 'profiling', false); // In case profiling is enabled, wrap the ProfilerCache around the current cache if (isset($profiling) && $profiling !== false) { return new Type\ProfilerCacheDecorator($cache, $this->profiler); } else { return $cache; } } }