X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FCore%2FCache.php;h=39c29566d3560df5c5d0ede30804c42ce10798d0;hb=4facd1dfdba93ede48ca40b5e146424e6701118b;hp=d6eeb4822b5684ebc924f03197afd1290b46caca;hpb=35d06bd9ebee5bad76d81a1d434090f3e255e20f;p=friendica.git diff --git a/src/Core/Cache.php b/src/Core/Cache.php index d6eeb4822b..39c29566d3 100644 --- a/src/Core/Cache.php +++ b/src/Core/Cache.php @@ -4,82 +4,68 @@ */ namespace Friendica\Core; -use Friendica\Core\Config; -use Friendica\Database\DBM; -use Friendica\Util\Temporal; -use dba; -use Memcache; - -require_once 'include/dba.php'; +use Friendica\Core\Cache\CacheDriverFactory; /** * @brief Class for storing data for a short time */ -class Cache +class Cache extends \Friendica\BaseObject { + const MONTH = 2592000; + const WEEK = 604800; + const DAY = 86400; + const HOUR = 3600; + const HALF_HOUR = 1800; + const QUARTER_HOUR = 900; + const FIVE_MINUTES = 300; + const MINUTE = 60; + const INFINITE = 0; + /** - * @brief Check for memcache and open a connection if configured - * - * @return object|boolean The memcache object - or "false" if not successful + * @var Cache\ICacheDriver */ - public static function memcache() - { - if (!function_exists('memcache_connect')) { - return false; - } - - if (!Config::get('system', 'memcache')) { - return false; - } - - $memcache_host = Config::get('system', 'memcache_host', '127.0.0.1'); - $memcache_port = Config::get('system', 'memcache_port', 11211); + private static $driver = null; + public static $driver_class = null; + public static $driver_name = null; - $memcache = new Memcache; + public static function init() + { + self::$driver_name = Config::get('system', 'cache_driver', 'database'); + self::$driver = CacheDriverFactory::create(self::$driver_name); + self::$driver_class = get_class(self::$driver); + } - if (!$memcache->connect($memcache_host, $memcache_port)) { - return false; + /** + * Returns the current cache driver + * + * @return Cache\ICacheDriver + */ + private static function getDriver() + { + if (self::$driver === null) { + self::init(); } - return $memcache; + return self::$driver; } /** - * @brief Return the duration for a given cache level + * @brief Returns all the cache keys sorted alphabetically * - * @param integer $level Cache level + * @param string $prefix Prefix of the keys (optional) * - * @return integer The cache duration in seconds + * @return array Empty if the driver doesn't support this feature + * @throws \Exception */ - private static function duration($level) + public static function getAllKeys($prefix = null) { - switch ($level) { - case CACHE_MONTH: - $seconds = 2592000; - break; - case CACHE_WEEK: - $seconds = 604800; - break; - case CACHE_DAY: - $seconds = 86400; - break; - case CACHE_HOUR: - $seconds = 3600; - break; - case CACHE_HALF_HOUR: - $seconds = 1800; - break; - case CACHE_QUARTER_HOUR: - $seconds = 900; - break; - case CACHE_FIVE_MINUTES: - $seconds = 300; - break; - case CACHE_MINUTE: - $seconds = 60; - break; - } - return $seconds; + $time = microtime(true); + + $return = self::getDriver()->getAllKeys($prefix); + + self::getApp()->saveTimestamp($time, 'cache'); + + return $return; } /** @@ -88,43 +74,17 @@ class Cache * @param string $key The key to the cached data * * @return mixed Cached $value or "null" if not found + * @throws \Exception */ public static function get($key) { - $memcache = self::memcache(); - if (is_object($memcache)) { - // We fetch with the hostname as key to avoid problems with other applications - $cached = $memcache->get(get_app()->get_hostname().":".$key); - $value = @unserialize($cached); - - // Only return a value if the serialized value is valid. - // We also check if the db entry is a serialized - // boolean 'false' value (which we want to return). - if ($cached === serialize(false) || $value !== false) { - return $value; - } - - return null; - } - - // Frequently clear cache - self::clear(); - - $cache = dba::selectFirst('cache', ['v'], ['k' => $key]); + $time = microtime(true); - if (DBM::is_result($cache)) { - $cached = $cache['v']; - $value = @unserialize($cached); + $return = self::getDriver()->get($key); - // Only return a value if the serialized value is valid. - // We also check if the db entry is a serialized - // boolean 'false' value (which we want to return). - if ($cached === serialize(false) || $value !== false) { - return $value; - } - } + self::getApp()->saveTimestamp($time, 'cache'); - return null; + return $return; } /** @@ -136,99 +96,48 @@ class Cache * @param mixed $value The value that is about to be stored * @param integer $duration The cache lifespan * - * @return void + * @return bool + * @throws \Exception */ - public static function set($key, $value, $duration = CACHE_MONTH) + public static function set($key, $value, $duration = self::MONTH) { - // Do we have an installed memcache? Use it instead. - $memcache = self::memcache(); - if (is_object($memcache)) { - // We store with the hostname as key to avoid problems with other applications - $memcache->set(get_app()->get_hostname().":".$key, serialize($value), MEMCACHE_COMPRESSED, self::duration($duration)); - return; - } - $fields = ['v' => serialize($value), 'expire_mode' => $duration, 'updated' => Temporal::utcNow()]; - $condition = ['k' => $key]; - dba::update('cache', $fields, $condition, true); + $time = microtime(true); + + $return = self::getDriver()->set($key, $value, $duration); + + self::getApp()->saveTimestamp($time, 'cache_write'); + + return $return; } /** - * @brief Remove outdated data from the cache + * @brief Delete a value from the cache * - * @param integer $max_level The maximum cache level that is to be cleared + * @param string $key The key to the cached data * - * @return void + * @return bool + * @throws \Exception */ - public static function clear($max_level = CACHE_MONTH) + public static function delete($key) { - // Clear long lasting cache entries only once a day - if (Config::get("system", "cache_cleared_day") < time() - self::duration(CACHE_DAY)) { - if ($max_level == CACHE_MONTH) { - $condition = ["`updated` < ? AND `expire_mode` = ?", - Temporal::utc("now - 30 days"), - CACHE_MONTH]; - dba::delete('cache', $condition); - } - - if ($max_level <= CACHE_WEEK) { - $condition = ["`updated` < ? AND `expire_mode` = ?", - Temporal::utc("now - 7 days"), - CACHE_WEEK]; - dba::delete('cache', $condition); - } - - if ($max_level <= CACHE_DAY) { - $condition = ["`updated` < ? AND `expire_mode` = ?", - Temporal::utc("now - 1 days"), - CACHE_DAY]; - dba::delete('cache', $condition); - } - Config::set("system", "cache_cleared_day", time()); - } - - if (($max_level <= CACHE_HOUR) && (Config::get("system", "cache_cleared_hour")) < time() - self::duration(CACHE_HOUR)) { - $condition = ["`updated` < ? AND `expire_mode` = ?", - Temporal::utc("now - 1 hours"), - CACHE_HOUR]; - dba::delete('cache', $condition); + $time = microtime(true); - Config::set("system", "cache_cleared_hour", time()); - } - - if (($max_level <= CACHE_HALF_HOUR) && (Config::get("system", "cache_cleared_half_hour")) < time() - self::duration(CACHE_HALF_HOUR)) { - $condition = ["`updated` < ? AND `expire_mode` = ?", - Temporal::utc("now - 30 minutes"), - CACHE_HALF_HOUR]; - dba::delete('cache', $condition); - - Config::set("system", "cache_cleared_half_hour", time()); - } - - if (($max_level <= CACHE_QUARTER_HOUR) && (Config::get("system", "cache_cleared_quarter_hour")) < time() - self::duration(CACHE_QUARTER_HOUR)) { - $condition = ["`updated` < ? AND `expire_mode` = ?", - Temporal::utc("now - 15 minutes"), - CACHE_QUARTER_HOUR]; - dba::delete('cache', $condition); + $return = self::getDriver()->delete($key); - Config::set("system", "cache_cleared_quarter_hour", time()); - } + self::getApp()->saveTimestamp($time, 'cache_write'); - if (($max_level <= CACHE_FIVE_MINUTES) && (Config::get("system", "cache_cleared_five_minute")) < time() - self::duration(CACHE_FIVE_MINUTES)) { - $condition = ["`updated` < ? AND `expire_mode` = ?", - Temporal::utc("now - 5 minutes"), - CACHE_FIVE_MINUTES]; - dba::delete('cache', $condition); - - Config::set("system", "cache_cleared_five_minute", time()); - } - - if (($max_level <= CACHE_MINUTE) && (Config::get("system", "cache_cleared_minute")) < time() - self::duration(CACHE_MINUTE)) { - $condition = ["`updated` < ? AND `expire_mode` = ?", - Temporal::utc("now - 1 minutes"), - CACHE_MINUTE]; - dba::delete('cache', $condition); + return $return; + } - Config::set("system", "cache_cleared_minute", time()); - } + /** + * @brief Remove outdated data from the cache + * + * @param boolean $outdated just remove outdated values + * + * @return bool + */ + public static function clear($outdated = true) + { + return self::getDriver()->clear($outdated); } }