CDbCache


system.caching
继承 class CDbCache » CCache » CApplicationComponent » CComponent
实现 ArrayAccess, ICache, IApplicationComponent
源自 1.0
版本 $Id: CDbCache.php 3515 2011-12-28 12:29:24Z mdomba $
源码
CDbCache以将缓存数据存储在数据库中的方式实现一个缓存应用组件。

CDbCache在一个名为cacheTableName的数据表里存储缓存数据。 若该表不存在,它会被自动创建。 通过设置autoCreateCacheTable为false,你可以手动创建数据表。

CDbCache依靠PDO来访问数据库。 默认情况下,它会使用一个在应用程序runtime目录下的SQLite3数据库。 你也可以指定connectionID来使用 一个数据库应用组件访问数据库。

查看CCache操作手册以了解CDbCache支持的常用缓存操作。

公共属性

属性 类型 描述 定义在
autoCreateCacheTable boolean 缓存数据表是否在不存在时自动创建。默认为true。 若你已经创建了数据表,建议将该属性设置为false以提高性能。 CDbCache
behaviors array 这个应用组件附加的行为。 这此行为将在应用组件调用init时附加在应用组件上。 请参照CModel::behaviors如何指定此属性值。 CApplicationComponent
cacheTableName string 存储缓存内容能够的数据表名字。默认为YiiCache。 注意,若autoCreateCacheTable为false且你希望 手动创建数据表,必须保证数据表结构如下:
(id CHAR(128) PRIMARY KEY, expire INTEGER, value BLOB)
注意,某些数据库管理系统可能不支持BLOB类型。这种情况下,用一个合适的 二进制数据类型(如MySQL的LONGBLOG、PostgreSQL的BYTEA)来代替BLOB。
CDbCache
connectionID string CDbConnection应用组件的ID。若没有设置, 将自动创建和使用SQLite3数据库。SQLite数据库文件 是protected/runtime/cache-YiiVersion. CDbCache
dbConnection CDbConnection 数据库连接实例 CDbCache
gCProbability integer 缓存一块数据时,会进行垃圾 收集的概率(百万分之一计)。默认为100,意味着0. CDbCache
isInitialized boolean 检查应用组件是否已经初始化。 CApplicationComponent
keyPrefix string 加在每个缓存键名前的字符串以保证键名是唯一的。默认值是application ID CCache

公共方法

方法 描述 定义在
__call() 如果类中没有调的方法名,则调用这个方法。 CComponent
__get() 返回一个属性值、一个事件处理程序列表或一个行为名称。 CComponent
__isset() 检查一个属性是否为null。 CComponent
__set() 设置一个组件的属性值。 CComponent
__unset() 设置一个组件的属性为null。 CComponent
add() 仅仅在甄别缓存值的键名不存在的情况下,往缓存中存储值。 CCache
asa() 返回这个名字的行为对象。 CComponent
attachBehavior() 附加一个行为到组件。 CComponent
attachBehaviors() 附加一个行为列表到组件。 CComponent
attachEventHandler() 为事件附加一个事件处理程序。 CComponent
canGetProperty() 确定属性是否可读。 CComponent
canSetProperty() 确定属性是否可写。 CComponent
delete() 从缓存中删除指定键名对应的值 CCache
detachBehavior() 从组件中分离一个行为。 CComponent
detachBehaviors() 从组件中分离所有行为。 CComponent
detachEventHandler() 分离一个存在的事件处理程序。 CComponent
disableBehavior() 禁用一个附加行为。 CComponent
disableBehaviors() 禁用组件附加的所有行为。 CComponent
enableBehavior() 启用一个附加行为。 CComponent
enableBehaviors() 启用组件附加的所有行为。 CComponent
evaluateExpression() 计算一个PHP表达式,或根据组件上下文执行回调。 CComponent
flush() 删除所有缓存值。 CCache
get() 从缓存中检索一个匹配指定键名的值。 CCache
getDbConnection() 返回数据库连接实例 CDbCache
getEventHandlers() 返回一个事件的附加处理程序列表。 CComponent
getGCProbability() 返回缓存一块数据时,会进行垃圾 收集的概率(百万分之一计)。默认为100,意味着0.01%的概率。 CDbCache
getIsInitialized() 检查应用组件是否已经初始化。 CApplicationComponent
hasEvent() 确定一个事件是否定义。 CComponent
hasEventHandler() 检查事件是否有附加的处理程序。 CComponent
hasProperty() 确定属性是否被定义。 CComponent
init() 初始化应用程序组件。 CDbCache
mget() 从缓存中检索出多个匹配指定键名的值。 CCache
offsetExists() 返回指定键名的缓存条目是否存在。 CCache
offsetGet() 从缓存中检索一个匹配指定键名的值。 CCache
offsetSet() 往缓存中存储一个用键名区分的值。 CCache
offsetUnset() 从缓存中删除指定键名对应的值 CCache
raiseEvent() 发起一个事件。 CComponent
set() 根据一个用以甄别的键名往缓存中存储一个值。 CCache
setDbConnection() 设置缓存组件使用的数据库连接。 CDbCache
setGCProbability() 设置缓存一块数据时,会进行垃圾 收集的概率(百万分之一计)。默认为100,意味着0.01%的概率。 数值必须在0到1000000之间。0意味着不会执行垃圾收集。 CDbCache

受保护方法

方法 描述 定义在
addValue() 仅仅在甄别缓存值的键名不存在的情况下,往缓存中存储值。 CDbCache
createCacheTable() 创建缓存数据表。 CDbCache
deleteValue() 从缓存中删除指定键名对应的值 CDbCache
flushValues() 删除所有缓存值。 CDbCache
gc() 删除过期数据。 CDbCache
generateUniqueKey() CCache
getValue() 从缓存中检索一个匹配指定键名的值。 CDbCache
getValues() 从缓存中检索出多个匹配指定键名的值。 CDbCache
setValue() 往缓存中存储一个用键名区分的值。 CDbCache

属性详细

autoCreateCacheTable 属性
public boolean $autoCreateCacheTable;

缓存数据表是否在不存在时自动创建。默认为true。 若你已经创建了数据表,建议将该属性设置为false以提高性能。

cacheTableName 属性
public string $cacheTableName;

存储缓存内容能够的数据表名字。默认为YiiCache。 注意,若autoCreateCacheTable为false且你希望 手动创建数据表,必须保证数据表结构如下:

(id CHAR(128) PRIMARY KEY, expire INTEGER, value BLOB)
注意,某些数据库管理系统可能不支持BLOB类型。这种情况下,用一个合适的 二进制数据类型(如MySQL的LONGBLOG、PostgreSQL的BYTEA)来代替BLOB。
connectionID 属性
public string $connectionID;

CDbConnection应用组件的ID。若没有设置, 将自动创建和使用SQLite3数据库。SQLite数据库文件 是protected/runtime/cache-YiiVersion.db.

dbConnection 属性

数据库连接实例

gCProbability 属性
public integer getGCProbability()
public void setGCProbability(integer $value)

缓存一块数据时,会进行垃圾 收集的概率(百万分之一计)。默认为100,意味着0.01%的概率。

方法详细

addValue() 方法
protected boolean addValue(string $key, string $value, integer $expire)
$key string 用以甄别缓存值的键名
$value string 要缓存的值
$expire integer 以秒为单位的数值,表示缓存的过期时间。为0则永不过期。
{return} boolean 成功存储到缓存中则返回true,否则返回false
protected function addValue($key,$value,$expire)
{
    if(!
$this->_gced && mt_rand(0,1000000)<$this->_gcProbability)
    {
        
$this->gc();
        
$this->_gced=true;
    }

    if(
$expire>0)
        
$expire+=time();
    else
        
$expire=0;
    
$sql="INSERT INTO {$this->cacheTableName} (id,expire,value) VALUES ('$key',$expire,:value)";
    try
    {
        
$command=$this->getDbConnection()->createCommand($sql);
        
$command->bindValue(':value',$value,PDO::PARAM_LOB);
        
$command->execute();
        return 
true;
    }
    catch(
Exception $e)
    {
        return 
false;
    }
}

仅仅在甄别缓存值的键名不存在的情况下,往缓存中存储值。 这是在父类中定义的方法的具体实现。

createCacheTable() 方法
protected void createCacheTable(CDbConnection $db, string $tableName)
$db CDbConnection 数据库连接
$tableName string 要创建的数据表名
protected function createCacheTable($db,$tableName)
{
    
$driver=$db->getDriverName();
    if(
$driver==='mysql')
        
$blob='LONGBLOB';
    else if(
$driver==='pgsql')
        
$blob='BYTEA';
    else
        
$blob='BLOB';
    
$sql=<<<EOD
CREATE TABLE $tableName
(
id CHAR(128) PRIMARY KEY,
expire INTEGER,
value 
$blob
)
EOD;
    
$db->createCommand($sql)->execute();
}

创建缓存数据表。

deleteValue() 方法
protected boolean deleteValue(string $key)
$key string 要删除值的键名
{return} boolean 如果删除期间没有发生错误
protected function deleteValue($key)
{
    
$sql="DELETE FROM {$this->cacheTableName} WHERE id='$key'";
    
$this->getDbConnection()->createCommand($sql)->execute();
    return 
true;
}

从缓存中删除指定键名对应的值 这是在父类中定义的方法的具体实现。

flushValues() 方法 (可用自 v1.1.5)
protected boolean flushValues()
{return} boolean 如果清空操作成功执行。
protected function flushValues()
{
    
$this->getDbConnection()->createCommand("DELETE FROM {$this->cacheTableName}")->execute();
    return 
true;
}

删除所有缓存值。 这是在父类中定义的方法的具体实现。

gc() 方法
protected void gc()
protected function gc()
{
    
$this->getDbConnection()->createCommand("DELETE FROM {$this->cacheTableName} WHERE expire>0 AND expire<".time())->execute();
}

删除过期数据。

getDbConnection() 方法
public CDbConnection getDbConnection()
{return} CDbConnection 数据库连接实例
public function getDbConnection()
{
    if(
$this->_db!==null)
        return 
$this->_db;
    else if((
$id=$this->connectionID)!==null)
    {
        if((
$this->_db=Yii::app()->getComponent($id)) instanceof CDbConnection)
            return 
$this->_db;
        else
            throw new 
CException(Yii::t('yii','CDbCache.connectionID "{id}" is invalid. Please make sure it refers to the ID of a CDbConnection application component.',
                array(
'{id}'=>$id)));
    }
    else
    {
        
$dbFile=Yii::app()->getRuntimePath().DIRECTORY_SEPARATOR.'cache-'.Yii::getVersion().'.db';
        return 
$this->_db=new CDbConnection('sqlite:'.$dbFile);
    }
}

getGCProbability() 方法
public integer getGCProbability()
{return} integer 缓存一块数据时,会进行垃圾 收集的概率(百万分之一计)。默认为100,意味着0.01%的概率。
public function getGCProbability()
{
    return 
$this->_gcProbability;
}

getValue() 方法
protected string getValue(string $key)
$key string 用以甄别缓存值的唯一键名
{return} string 缓存中存储的值,如果该值不存在或者已过期则返回false。
protected function getValue($key)
{
    
$time=time();
    
$sql="SELECT value FROM {$this->cacheTableName} WHERE id='$key' AND (expire=0 OR expire>$time)";
    
$db=$this->getDbConnection();
    if(
$db->queryCachingDuration>0)
    {
        
$duration=$db->queryCachingDuration;
        
$db->queryCachingDuration=0;
        
$result=$db->createCommand($sql)->queryScalar();
        
$db->queryCachingDuration=$duration;
        return 
$result;
    }
    else
        return 
$db->createCommand($sql)->queryScalar();
}

从缓存中检索一个匹配指定键名的值。 这是在父类中定义的方法的具体实现。

getValues() 方法
protected array getValues(array $keys)
$keys array 用以甄别缓存值的键名列表
{return} array 以$keys为键名的缓存值列表
protected function getValues($keys)
{
    if(empty(
$keys))
        return array();

    
$ids=implode("','",$keys);
    
$time=time();
    
$sql="SELECT id, value FROM {$this->cacheTableName} WHERE id IN ('$ids') AND (expire=0 OR expire>$time)";

    
$db=$this->getDbConnection();
    if(
$db->queryCachingDuration>0)
    {
        
$duration=$db->queryCachingDuration;
        
$db->queryCachingDuration=0;
        
$rows=$db->createCommand($sql)->queryAll();
        
$db->queryCachingDuration=$duration;
    }
    else
        
$rows=$db->createCommand($sql)->queryAll();

    
$results=array();
    foreach(
$keys as $key)
        
$results[$key]=false;
    foreach(
$rows as $row)
        
$results[$row['id']]=$results[$row['value']];
    return 
$results;
}

从缓存中检索出多个匹配指定键名的值。

init() 方法
public void init()
public function init()
{
    
parent::init();

    
$db=$this->getDbConnection();
    
$db->setActive(true);
    if(
$this->autoCreateCacheTable)
    {
        
$sql="DELETE FROM {$this->cacheTableName} WHERE expire>0 AND expire<".time();
        try
        {
            
$db->createCommand($sql)->execute();
        }
        catch(
Exception $e)
        {
            
$this->createCacheTable($db,$this->cacheTableName);
        }
    }
}

初始化应用程序组件。

该方法在接口IApplicationComponent中有要求。 它确保缓存数据表已存在。 同时从缓存中删除过期其数据项。

setDbConnection() 方法 (可用自 v1.1.5)
public void setDbConnection(CDbConnection $value)
$value CDbConnection 数据库连接实例
public function setDbConnection($value)
{
    
$this->_db=$value;
}

设置缓存组件使用的数据库连接。

setGCProbability() 方法
public void setGCProbability(integer $value)
$value integer 缓存一块数据时,会进行垃圾 收集的概率(百万分之一计)。默认为100,意味着0.01%的概率。 数值必须在0到1000000之间。0意味着不会执行垃圾收集。
public function setGCProbability($value)
{
    
$value=(int)$value;
    if(
$value<0)
        
$value=0;
    if(
$value>1000000)
        
$value=1000000;
    
$this->_gcProbability=$value;
}

setValue() 方法
protected boolean setValue(string $key, string $value, integer $expire)
$key string 用以甄别缓存值的键名
$value string 要缓存的值
$expire integer 以秒为单位的数值,表示缓存的过期时间。为0则永不过期。
{return} boolean 成功存储到缓存中则返回true,否则返回false
protected function setValue($key,$value,$expire)
{
    
$this->deleteValue($key);
    return 
$this->addValue($key,$value,$expire);
}

往缓存中存储一个用键名区分的值。 这是在父类中定义的方法的具体实现。