zoukankan      html  css  js  c++  java
  • Yii 的AR单行数据自动缓存机制

    68341342289776.jpg

    相关的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

  • 相关阅读:
    PL/SQL中的 not
    正则12和\1的理解
    eclipse/myeclipse注释模板的修改
    jboss修改内存
    myEclipse开发内存溢出解决办法myEclipse调整jvm内存大小 java.lang.OutOfMemoryError: PermGen space及其解决方法
    MyEclipse 启动报错:'Building workspace' has encountered a problem解决方法
    jboss 7.1.1.final 报错 set the maxParameterCount attribute on the Connector
    在 Ubuntu/Debian 下安装 PHP7.3 教程
    mariadb新安装解决远程访问以及root登录
    Docker 探索安装WordPress+Mysql8.0
  • 原文地址:https://www.cnblogs.com/imxiu/p/3451715.html
Copyright © 2011-2022 走看看