Yii 的AR单行数据自动缓存机制

相关的YII类:

CActiveRecord

CActiveRecordBehavior

cache

Active Record

Active Record (AR) 是一个流行的 对象-关系映射 (ORM) 技术。Yii DAO 可以处理几乎任何数据库相关的任务,不过对于一些基本的CRUD,YII推荐使用Active Record。

 

CActiveRecord 提供了几个占位符方法,它们可以在子类中被覆盖以自定义其工作流:

beforeValidate 和 afterValidate: 在一个表单提交动作触发的基于AJAX的验证执行之前和之后被调用的函数(仅当validateOnSubmit设置为true时可用)。

beforeSave 和 afterSave: 这两个将在保存 AR 实例之前和之后被调用。

beforeDelete 和 afterDelete: 这两个将在一个 AR 实例被删除之前和之后被调用。

afterConstruct: 这个将在每个使用 new 操作符创建 AR 实例后被调用。

beforeFind: 这个将在一个 AR 查找器被用于执行查询(例如 find(), findAll())之前被调用。 1.0.9 版本开始可用。

afterFind: 这个将在每个 AR 实例作为一个查询结果创建时被调用。

缓存

缓存是用于提升网站性能的一种即简单又有效的途径。通过存储相对静态的数据至缓存以备所需,我们可以省去生成这些数据的时间。

实现代码

YiicmsActiveRecord.php 继承 CActiveRecord.php

/**

 * Base class for all active records

 * @author biner

 * @since 1.1

 * @package Yiicms.log

 *

 */

abstract class YiicmsActiveRecord extends CActiveRecord

{

    public function behaviors()

    {

        return array(

            // YII AR的事件行为

            'YiicmsActiveRecordBehavior'

        );

    }

    /**

    * 获得model的类名

    */

    public function getModelClass()

    {

        $modelclass = get_class($this);

        return $modelclass;

    }

    /**

    * 获得某行记录的缓存键值

    */

    public function getCacheKey($pk = '')

    {

        $modelclass = $this->getModelClass();

        $model_pk = $this->getPrimaryKey();

        $pk = $model_pk?$model_pk:$pk;

        $key = 'resource_'.$modelclass.'_'.$pk;

        //var_dump($key);die;

        return $key;

    }

    /**

    * 重写findByPk方法,如果缓存存在数据,则直接读取缓存

    * 在YiicmsActiveRecordBehavior中,一旦有数据更新则删除缓存

    */

    public function findByPk($pk,$condition='',$params=array())

    {

        $key = $this->getCacheKey($pk);

        //Yii::app()->cache->delete($key);

        $resource=Yii::app()->cache->get($key);

        if($resource===false)

        {

            $resource=parent::findByPk($pk,$condition,$params);

            Yii::app()->cache->set($key,$resource);

            // 因为在缓存中没找到,重新生成 $value

            // 再缓存一下以备下次使用

            // Yii::app()->cache->set($id,$value);

        }

        return $resource;

    }

}

YiicmsActiveRecordBehavior.php 继承CActiveRecordBehavior类

/**

 * Base class for all active records

 * @author biner

 * @since 1.1

 * @package Yiicms.log

 *

 */

class YiicmsActiveRecordBehavior extends CActiveRecordBehavior

{

    private $_oldattributes = array();

   

    public function beforeSave($event)

    {

        //删除缓存

        $key = $this->Owner->getCacheKey();

        Yii::app()->cache->delete($key);

   

        $attributes = $this->Owner->getAttributes();

        $this->setOldAttributes($attributes);

    }

}

Product.php 继承 YiicmsActiveRecord

/**

 * 脚手架自动生成的AR修改为继承YiicmsActiveRecord

 *

 */

class Product extends YiicmsActiveRecord

{

    //......

    //.....

}

From: http://www.yiibase.com/yii/view/172.html

你可能感兴趣的:(yii)