Beruflich Dokumente
Kultur Dokumente
php
/**
* CCache class file.
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @link http://www.yiiframework.com/
* @copyright 2008-2013 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
/**
* CCache is the base class for cache classes with different cache storage imple
mentation.
*
* A data item can be stored in cache by calling {@link set} and be retrieved ba
ck
* later by {@link get}. In both operations, a key identifying the data item is
required.
* An expiration time and/or a dependency can also be specified when calling {@l
ink set}.
* If the data item expires or the dependency changes, calling {@link get} will
not
* return back the data item.
*
* Note, by definition, cache does not ensure the existence of a value
* even if it does not expire. Cache is not meant to be a persistent storage.
*
* CCache implements the interface {@link ICache} with the following methods:
* <ul>
* <li>{@link get} : retrieve the value with a key (if any) from cache</li>
* <li>{@link set} : store the value with a key into cache</li>
* <li>{@link add} : store the value only if cache does not have this key</li>
* <li>{@link delete} : delete the value with the specified key from cache</li>
* <li>{@link flush} : delete all values from cache</li>
* </ul>
*
* Child classes must implement the following methods:
* <ul>
* <li>{@link getValue}</li>
* <li>{@link setValue}</li>
* <li>{@link addValue}</li>
* <li>{@link deleteValue}</li>
* <li>{@link getValues} (optional)</li>
* <li>{@link flushValues} (optional)</li>
* <li>{@link serializer} (optional)</li>
* </ul>
*
* CCache also implements ArrayAccess so that it can be used like an array.
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @package system.caching
* @since 1.0
*/
abstract class CCache extends CApplicationComponent implements ICache, ArrayAcce
ss
{
/**
* @var string a string prefixed to every cache key so that it is unique
. Defaults to null which means
* to use the {@link CApplication::getId() application ID}. If different
/**
* Retrieves a value from cache with a specified key.
* @param string $id a key identifying the cached value
* @return mixed the value stored in cache, false if the value is not in
the cache, expired or the dependency has changed.
*/
public function get($id)
{
$value = $this->getValue($this->generateUniqueKey($id));
if($value===false || $this->serializer===false)
return $value;
if($this->serializer===null)
$value=unserialize($value);
else
$value=call_user_func($this->serializer[1], $value);
if(is_array($value) && (!$value[1] instanceof ICacheDependency |
| !$value[1]->getHasChanged()))
{
Yii::trace('Serving "'.$id.'" from cache','system.cachin
g.'.get_class($this));
return $value[0];
}
else
return false;
}
/**
* Retrieves multiple values from cache with the specified keys.
* Some caches (such as memcache, apc) allow retrieving multiple cached
values at one time,
* which may improve the performance since it reduces the communication
cost.
* In case a cache does not support this feature natively, it will be si
mulated by this method.
* @param array $ids list of keys identifying the cached values
* @return array list of cached values corresponding to the specified ke
ys. The array
* is returned in terms of (key,value) pairs.
* If a value is not cached or expired, the corresponding array value wi
ll be false.
*/
public function mget($ids)
{
$uids = array();
foreach ($ids as $id)
$uids[$id] = $this->generateUniqueKey($id);
$values = $this->getValues($uids);
$results = array();
if($this->serializer === false)
{
foreach ($uids as $id => $uid)
$results[$id] = isset($values[$uid]) ? $values[$
uid] : false;
}
else
{
foreach($uids as $id => $uid)
{
$results[$id] = false;
if(isset($values[$uid]))
{
$value = $this->serializer === null ? un
serialize($values[$uid]) : call_user_func($this->serializer[1], $values[$uid]);
if(is_array($value) && (!$value[1] insta
nceof ICacheDependency || !$value[1]->getHasChanged()))
{
Yii::trace('Serving "'.$id.'" fr
om cache','system.caching.'.get_class($this));
$results[$id] = $value[0];
}
}
}
}
return $results;
}
/**
* Stores a value identified by a key into cache.
* If the cache already contains such a key, the existing value and
* expiration time will be replaced with the new ones.
*
* @param string $id the key identifying the value to be cached
* @param mixed $value the value to be cached
* @param integer $expire the number of seconds in which the cached valu
e will expire. 0 means never expire.
* @param ICacheDependency $dependency dependency of the cached item. If
the dependency changes, the item is labeled invalid.
* @return boolean true if the value is successfully stored into cache,
false otherwise
*/
public function set($id,$value,$expire=0,$dependency=null)
{
Yii::trace('Saving "'.$id.'" to cache','system.caching.'.get_cla
ss($this));
if ($dependency !== null && $this->serializer !== false)
$dependency->evaluateDependency();
if ($this->serializer === null)
$value = serialize(array($value,$dependency));
elseif ($this->serializer !== false)
$value = call_user_func($this->serializer[0], array($val
ue,$dependency));
return $this->setValue($this->generateUniqueKey($id), $value, $e
xpire);
}
/**
* Stores a value identified by a key into cache if the cache does not c
ontain this key.
* Nothing will be done if the cache already contains the key.
* @param string $id the key identifying the value to be cached
* @param mixed $value the value to be cached
* @param integer $expire the number of seconds in which the cached valu
e will expire. 0 means never expire.
* @param ICacheDependency $dependency dependency of the cached item. If
the dependency changes, the item is labeled invalid.
* @return boolean true if the value is successfully stored into cache,
false otherwise
*/
public function add($id,$value,$expire=0,$dependency=null)
{
Yii::trace('Adding "'.$id.'" to cache','system.caching.'.get_cla
ss($this));
if ($dependency !== null && $this->serializer !== false)
$dependency->evaluateDependency();
if ($this->serializer === null)
$value = serialize(array($value,$dependency));
elseif ($this->serializer !== false)
$value = call_user_func($this->serializer[0], array($val
ue,$dependency));
return $this->addValue($this->generateUniqueKey($id), $value, $e
xpire);
}
/**
* Deletes a value with the specified key from cache
* @param string $id the key of the value to be deleted
* @return boolean if no error happens during deletion
*/
public function delete($id)
{
Yii::trace('Deleting "'.$id.'" from cache','system.caching.'.get
_class($this));
return $this->deleteValue($this->generateUniqueKey($id));
}
/**
* Deletes all values from cache.
* Be careful of performing this operation if the cache is shared by mul
tiple applications.
* @return boolean whether the flush operation was successful.
*/
public function flush()
{
Yii::trace('Flushing cache','system.caching.'.get_class($this));
return $this->flushValues();
}
/**
* Retrieves a value from cache with a specified key.
* This method should be implemented by child classes to retrieve the da
ta
* from specific cache storage. The uniqueness and dependency are handle
d
* in {@link get()} already. So only the implementation of data retrieva
l
* is needed.
* @param string $key a unique key identifying the cached value
* @return string|boolean the value stored in cache, false if the value
is not in the cache or expired.
* @throws CException if this method is not overridden by child classes
*/
protected function getValue($key)
{
/**
* Stores the value identified by a key into cache.
* If the cache already contains such a key, the existing value will be
* replaced with the new ones. To add expiration and dependencies, use t
he set() method.
* This method is required by the interface ArrayAccess.
* @param string $id the key identifying the value to be cached
* @param mixed $value the value to be cached
*/
public function offsetSet($id, $value)
{
$this->set($id, $value);
}
/**
* Deletes the value with the specified key from cache
* This method is required by the interface ArrayAccess.
* @param string $id the key of the value to be deleted
* @return boolean if no error happens during deletion
*/
public function offsetUnset($id)
{
$this->delete($id);
}
}