From 0e2ac86566a1cdf862f4e2c091e21eff0d2445b0 Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Tue, 27 Aug 2013 17:24:09 +0200 Subject: [PATCH] added Cache::exists() to check key existance in cache --- framework/yii/caching/ApcCache.php | 14 ++++++++++---- framework/yii/caching/Cache.php | 19 +++++++++++++++++++ tests/unit/framework/caching/CacheTestCase.php | 12 ++++++++++++ 3 files changed, 41 insertions(+), 4 deletions(-) diff --git a/framework/yii/caching/ApcCache.php b/framework/yii/caching/ApcCache.php index 60f2ec1..6c2754a 100644 --- a/framework/yii/caching/ApcCache.php +++ b/framework/yii/caching/ApcCache.php @@ -21,12 +21,18 @@ namespace yii\caching; class ApcCache extends Cache { /** - * Checks the existence of a key in APC cache. - * @param string $key the key to be checked. - * @return boolean if the key exists or not + * Checks whether a specified key exists in the cache. + * This can be faster than getting the value from the cache if the data is big. + * Note that this method does not check whether the dependency associated + * with the cached data, if there is any, has changed. So a call to [[get]] + * may return false while exists returns true. + * @param mixed $key a key identifying the cached value. This can be a simple string or + * a complex data structure consisting of factors representing the key. + * @return boolean true if a value exists in cache, false if the value is not in the cache or expired. */ - public function keyExists($key) + public function exists($key) { + $key = $this->buildKey($key); return apc_exists($key); } diff --git a/framework/yii/caching/Cache.php b/framework/yii/caching/Cache.php index a6ee455..b129294 100644 --- a/framework/yii/caching/Cache.php +++ b/framework/yii/caching/Cache.php @@ -134,6 +134,25 @@ abstract class Cache extends Component implements \ArrayAccess } /** + * Checks whether a specified key exists in the cache. + * This can be faster than getting the value from the cache if the data is big. + * In case a cache does not support this feature natively, this method will try to simulate it + * but has no performance improvement over getting it. + * Note that this method does not check whether the dependency associated + * with the cached data, if there is any, has changed. So a call to [[get]] + * may return false while exists returns true. + * @param mixed $key a key identifying the cached value. This can be a simple string or + * a complex data structure consisting of factors representing the key. + * @return boolean true if a value exists in cache, false if the value is not in the cache or expired. + */ + public function exists($key) + { + $key = $this->buildKey($key); + $value = $this->getValue($key); + return $value !== false; + } + + /** * Retrieves multiple values from cache with the specified keys. * Some caches (such as memcache, apc) allow retrieving multiple cached values at the same time, * which may improve the performance. In case a cache does not support this feature natively, diff --git a/tests/unit/framework/caching/CacheTestCase.php b/tests/unit/framework/caching/CacheTestCase.php index 491459b..94894a3 100644 --- a/tests/unit/framework/caching/CacheTestCase.php +++ b/tests/unit/framework/caching/CacheTestCase.php @@ -91,6 +91,18 @@ abstract class CacheTestCase extends TestCase $this->assertEquals('array_test', $array['array_test']); } + public function testExists() + { + $cache = $this->prepare(); + + $this->assertTrue($cache->exists('string_test')); + // check whether exists affects the value + $this->assertEquals('string_test', $cache->get('string_test')); + + $this->assertTrue($cache->exists('number_test')); + $this->assertFalse($cache->exists('not_exists')); + } + public function testArrayAccess() { $cache = $this->getCacheInstance();