X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FCore%2FCache.php;h=cc77d9bfd0dc7e35598130af672287454ffdd25c;hb=daa1177e3a1e42b4c95e0a8759f1610942b952c7;hp=39f5d12fa9fc550017eb3854b44ef6f34cc718f5;hpb=d9e9cbe7534ec05a131ac250ef9912cdaf7078ee;p=friendica.git diff --git a/src/Core/Cache.php b/src/Core/Cache.php index 39f5d12fa9..cc77d9bfd0 100644 --- a/src/Core/Cache.php +++ b/src/Core/Cache.php @@ -4,78 +4,46 @@ */ namespace Friendica\Core; -use Friendica\Core\Config; -use Friendica\Core\PConfig; -use Friendica\Database\DBM; +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; + /** - * @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; - } + private static $driver = null; - $memcache_host = Config::get('system', 'memcache_host', '127.0.0.1'); - $memcache_port = Config::get('system', 'memcache_port', 11211); - - $memcache = new Memcache; - - if (!$memcache->connect($memcache_host, $memcache_port)) { - return false; - } + public static function init() + { + $driver_name = Config::get('system', 'cache_driver', 'database'); - return $memcache; + self::$driver = CacheDriverFactory::create($driver_name); } /** - * @brief Return the duration for a given cache level - * - * @param integer $level Cache level + * Returns the current cache driver * - * @return integer The cache duration in seconds + * @return Cache\ICacheDriver */ - private static function duration($level) + private static function getDriver() { - 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; + if (self::$driver === null) { + self::init(); } - return $seconds; + + return self::$driver; } /** @@ -87,43 +55,13 @@ class Cache */ 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($duration); - - $r = q( - "SELECT `v` FROM `cache` WHERE `k`='%s' LIMIT 1", - dbesc($key) - ); + $time = microtime(true); - if (DBM::is_result($r)) { - $cached = $r[0]['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()->save_timestamp($time, 'cache'); - return null; + return $return; } /** @@ -135,113 +73,46 @@ class Cache * @param mixed $value The value that is about to be stored * @param integer $duration The cache lifespan * - * @return void + * @return bool */ - 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; - } + $time = microtime(true); - /// @todo store the cache data in the same way like the config data - q( - "REPLACE INTO `cache` (`k`,`v`,`expire_mode`,`updated`) VALUES ('%s','%s',%d,'%s')", - dbesc($key), - dbesc(serialize($value)), - intval($duration), - dbesc(datetime_convert()) - ); + $return = self::getDriver()->set($key, $value, $duration); + + self::getApp()->save_timestamp($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 */ - 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) { - q( - "DELETE FROM `cache` WHERE `updated` < '%s' AND `expire_mode` = %d", - dbesc(datetime_convert('UTC', 'UTC', "now - 30 days")), - intval(CACHE_MONTH) - ); - } - - if ($max_level <= CACHE_WEEK) { - q( - "DELETE FROM `cache` WHERE `updated` < '%s' AND `expire_mode` = %d", - dbesc(datetime_convert('UTC', 'UTC', "now - 7 days")), - intval(CACHE_WEEK) - ); - } - - if ($max_level <= CACHE_DAY) { - q( - "DELETE FROM `cache` WHERE `updated` < '%s' AND `expire_mode` = %d", - dbesc(datetime_convert('UTC', 'UTC', "now - 1 days")), - intval(CACHE_DAY) - ); - } - Config::set("system", "cache_cleared_day", time()); - } - - if (($max_level <= CACHE_HOUR) && (Config::get("system", "cache_cleared_hour")) < time() - self::duration(CACHE_HOUR)) { - q( - "DELETE FROM `cache` WHERE `updated` < '%s' AND `expire_mode` = %d", - dbesc(datetime_convert('UTC', 'UTC', "now - 1 hours")), - intval(CACHE_HOUR) - ); - - 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)) { - q( - "DELETE FROM `cache` WHERE `updated` < '%s' AND `expire_mode` = %d", - dbesc(datetime_convert('UTC', 'UTC', "now - 30 minutes")), - intval(CACHE_HALF_HOUR) - ); - - 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)) { - q( - "DELETE FROM `cache` WHERE `updated` < '%s' AND `expire_mode` = %d", - dbesc(datetime_convert('UTC', 'UTC', "now - 15 minutes")), - intval(CACHE_QUARTER_HOUR) - ); - - Config::set("system", "cache_cleared_quarter_hour", time()); - } + $time = microtime(true); - if (($max_level <= CACHE_FIVE_MINUTES) && (Config::get("system", "cache_cleared_five_minute")) < time() - self::duration(CACHE_FIVE_MINUTES)) { - q( - "DELETE FROM `cache` WHERE `updated` < '%s' AND `expire_mode` = %d", - dbesc(datetime_convert('UTC', 'UTC', "now - 5 minutes")), - intval(CACHE_FIVE_MINUTES) - ); + $return = self::getDriver()->delete($key); - Config::set("system", "cache_cleared_five_minute", time()); - } + self::getApp()->save_timestamp($time, 'cache_write'); - if (($max_level <= CACHE_MINUTE) && (Config::get("system", "cache_cleared_minute")) < time() - self::duration(CACHE_MINUTE)) { - q( - "DELETE FROM `cache` WHERE `updated` < '%s' AND `expire_mode` = %d", - dbesc(datetime_convert('UTC', 'UTC', "now - 1 minutes")), - intval(CACHE_MINUTE) - ); + return $return; + } - Config::set("system", "cache_cleared_minute", time()); - } + /** + * @brief Remove outdated data from the cache + * + * @param integer $max_level The maximum cache level that is to be cleared + * + * @return void + */ + public static function clear() + { + return self::getDriver()->clear(); } }