• yii 缓存探究


    1、在配置文件中

    //在权威指南上是'cache'  其实可以根据不同的缓存组件起不同的名称
            
            //memcache缓存
    
            'memcache' => array(
                'class' => 'system.caching.CMemCache',
                'servers' => array( array('host' => '127.0.0.1', 'port' => 11211,'weight'=>40)),
                /*
                 * yii中的memcache可以理解为在原始memcache的基础上进行的一种封装,比如将key值加密,这样更安全
                 *   但是原始的操作就不能用了,如果想用的话,需要下面的配置项
                 */
    
               /* 'keyPrefix' => '',
                'hashKey' => false,
                'serializer' => false*/
            ) ,
    
            //数据库缓存
    
            'dbcache'=>array(
                'class'=>'system.caching.CDbCache',
                /*
                 * 如果没有下面的connectionID  将会默认的使用sqlite 存储在runtime目录下;
                 * 其中的db就是配置的db的数据库组件,这样会在对应的数据库自动建立数据表保存数据
                */
                'connectionID'=>'db',
            ),
    
            //文件缓存
    
            'filecache'=>array(
                'class'=>'system.caching.CFileCache',
                //我们使用CFileCache实现缓存,缓存文件存放在runtime文件夹中
                'directoryLevel'=>'2',   //缓存文件的目录深度
            ),
    
            //APC缓存
    
            /*
             * 在php5.5+版本  php集成opcache 有实验证明opcache性能要优于APC
             */
            'apccache' => 'system.caching.CApcCache',
    
            /* 'db'=>array(
                 'connectionString' => 'sqlite:'.dirname(__FILE__).'/../data/testdrive.db',
             ),*/

    2、在控制器中操作

    /*
         * memcache缓存 
         */
        public  function actionMemcacheDemo(){
            $key = 'address';
            $value = 'china';
            Yii::app()->memcache->set($key,$value);
            echo Yii::app()->memcache->get($key);
    
        }
    
        /*
         * 数据库缓存
         */
        public function actionDbcacheDemo(){
            $key = 'test';
            $value = "love";
            Yii::app()->dbcache ->set($key, $value);
            echo Yii::app()->dbcache ->get($key);
        }
    
        /*
         * 文件缓存
         */
        public function actionFilecacheDemo(){
            Yii::app()->filecache->set('name', 'maozedong');
            $name = Yii::app()->filecache->get('name');
            echo $name;
        }
    
        /*
         * APC缓存
         */
        public function actionApcDemo(){
            Yii::app()->apccache->set('name', 'maozedong');
            $name = Yii::app()->apccache->get('name');
            echo $name;
        }

    开始很疑惑,这个APC在我的印象中是加速php中间码的,怎么也可以用来用来存储一个数据呢?探究一番之后原来,APC的缓存分两部分,系统缓存和用户缓存。参考文章:http://blog.csdn.net/liuxinmingcode/article/details/8058864

    系统缓存
    它是指APC把PHP文件源码的编译结果缓存起来,然后在每次调用时先对比时间标记。如果未过期,则使用缓存的中间代码运行。默认缓存
     3600s(一小时)。但是这样仍会浪费大量CPU时间。因此可以在php.ini中设置system缓存为永不过期(apc.ttl=0)。不过如果这样设置,改运php代码后需要重启WEB服务器。目前使用较多的是指此类缓存。
    用户数据缓存
    缓存由用户在编写PHP代码时用apc_store和apc_fetch函数操作读取、写入的。如果数据量不大的话,可以一试。如果数据量大,使用类似memcache此类的更

    因为opcache的性能要比apc好很多,所以下面的apc略过,用opcache来代替。

    上面都是保存的单个的数据,其中memcache缓存将数据放到内存里,数据库缓存将数据放在一个表里,文件缓存将数据放在文件里,文件在runtime目录下。

    3、片段缓存

    <!--控制器中-->
    <?php
    /*
    * 片段缓存  在pageList数据表中取出10条数据
    */
    public function actionPartCache(){
    $page_result = Pagelist::model()->findAll(array(
    'order' => 'id desc',
    'limit' => 10,
    'offset' => 0,
    ));
    $this->render('partcache',array('page_result'=>$page_result));
    }
    ?>
    <!--视图文件中-->
    <?php if($this->begincache('123123', array('duration'=>3600))) { ?>
    <?php
    foreach($page_result as $value){
        echo $value->title."<br/>";
    }?>
    <?php $this->endcache(); } ?>

    我从一个表中取出10条数据进行缓存,但是尝试了很多次无效。。。最后是更改了配置文件中,文件缓存的名字为cache,这下可以了

     //文件缓存
    
            'cache'=>array(
                'class'=>'system.caching.CFileCache',
                //我们使用CFileCache实现缓存,缓存文件存放在runtime文件夹中
                'directoryLevel'=>'2',   //缓存文件的目录深度
            ),

    看来是有相互的依赖性,yii并没有提供beginfilecache,所以必须将文件缓存的配置名为cache。片段缓存是在runtime目录下的cache文件夹。

    4、文件缓存

    文件缓存是在控制里的filter方法里

     public function filters() {
    
            return array (
    
                array (
    
                    'COutputCache + post, list',
    
                    'duration' => 3600,
    
                    'varyByParam' => array('id','page'),
                );

               'dependency' => array(

    
    

                        'class'=>'CDbCacheDependency',

    
    

                        'sql'=>'SELECT MAX(id) FROM me115_book',

    
    

                    )

    
    
        }

    COutputCache 是用于处理缓存的类,如果只填'COutputCache',则控制器里所有action都会通过缓存过滤,定义'COutputCache + post, list',表示只对以下方法进行缓存:actionPost, actionList

    duration 是缓存的时间,单位是秒,

    varyByParam 是指定一系列GET参数名称列表, 使用相应的值去确定缓存内容的版本,即同一个action用于区分是不同页面的的参数,此处我以id和page来区分不同页面。

    除varyByParam以外,还可以采用其他的条件来区分页面:

    varyByExpression:指定缓存内容通过自定义的PHP表达式的结果而变化

    varyByRoute:指定缓存内容基于请求的路由不同而变化 (controller 和 action)

    varyBySession:指定是否缓存内容. 因用户session不同而变化

    dependency'指定缓存失效依赖关系:可指定文件或数据库;本文采用的是数据库依赖CDbCacheDependency;

    本例指定的是数据库,通过数据表的某个值的变化来确定缓存是否失效。例如,如果在表中新增了一条me115_book记录,即使缓存才过了2分钟(<3600),仍然判断为失效,从而查询数据库,生成整个页面,再次缓存。

    参考文章:http://www.cnblogs.com/me115/archive/2012/12/17/2821184.html

    5、关于opcache

    在php.ini中引入opcache

    可以在界面看到opcache的效率的插件,地址https://github.com/SchumacherFM/Magento-OpCache

    在yii中不必配置直接可以使用

    6、缓存时间 缓存依赖

    单个数据缓存 时间依赖

    //文件缓存 时间依赖
        public function actionFileDemo(){
           // Yii::app()->cache->set('address','henan',10);
            $value = Yii::app()->cache->get('address');
            if($value === false){
                Yii::app()->cache->set('address','shanghai',10);
                $value=Yii::app()->cache->get('address');
            }
            echo $value;
     
        }
     
        //数据库缓存  时间依赖
        public function actionDbTime(){
          //  Yii::app()->dbcache->set('school','yuanlu',20);
            $value = Yii::app()->dbcache->get('school');
            if($value === false){
                Yii::app()->dbcache->set('school','lema',20);
                $value = Yii::app()->dbcache->get('school');
            }
            echo $value;
        }
     
        //memcache缓存 时间依赖、
        public function actionMemTime(){
          //  Yii::app()->memcache->set('teacher','yuan',20);
            $value = Yii::app()->memcache->get('teacher');
            if($value === false){
                Yii::app()->memcache->set('teacher','zhang',20);
                $value = Yii::app()->memcache->get('teacher');
            }
            echo $value;
        }

    文件和目录依赖

    public function actionFileDemo(){
            // Yii::app()->cache->set('address333','henan444',new CFileCacheDependency(Yii::app()->basePath.'controllerPagelistController.php'));
             $value = Yii::app()->cache->get('address333');
            if($value === false){
                Yii::app()->cache->set('address333','shanghai333', new CFileCacheDependency(Yii::app()->basePath.'controllerPagelistController.php'));
                $value=Yii::app()->cache->get('address333');
            }
            echo $value;
           // echo Yii::app()->basePath.'controllerPagelistController.php';
            //echo Yii::app()->basePath;
        }
        
    
    
    public function actionFileDemo(){
            // Yii::app()->cache->set('address333','henan444',new CFileCacheDependency(Yii::app()->basePath.'controllerPagelistController.php'));
            // Yii::app()->cache->set('addressml','henan444',new CFileCacheDependency(Yii::app()->basePath.'config'));
             Yii::app()->cache->set('addressml','henan444',new CFileCacheDependency(Yii::app()->basePath.'config'));
             $value = Yii::app()->cache->get('addressml');
            if($value === false){
                Yii::app()->cache->set('addressml','shanghai333', new CFileCacheDependency(Yii::app()->basePath.'config'));
                $value=Yii::app()->cache->get('addressml');
            }
            echo $value;
           // echo Yii::app()->basePath.'controllerPagelistController.php';
            //echo Yii::app()->basePath;
        }

    片段缓存依赖

    <?php if($this->begincache('123123', array(
        'duration'=>3600,
        'dependency'=>array(
            'class'=>'system.caching.dependencies.CDbCacheDependency',
            'sql'=>'select max(id) from pagelist',
        ),
    ))) { ?>
    <?php
    foreach($page_result as $value){
        echo $value->title."<br/>";
    }?>
    <?php $this->endcache(); } ?>
    //可以设置过期时间  duration 
    //设置依赖过期时间   配置dependency   如果数据表中pagelist中的最大的id发生变化,则更新缓存的内容。
  • 相关阅读:
    Linux中逻辑卷的快照与还原
    Linux 中磁盘阵列RAID10损坏以及修复
    Linux 中磁盘阵列RAID10配置
    Linux 中磁盘容量配额
    Centos7VMware虚拟机最小化安装后,安装Tenda U12 USB无线网卡驱动
    安装vmware-tools遇the path "" is not valid path to the gcc binary和the path "" is not a valid path to the 3.10.0-327.e17.x86_64 kernel headers问题解决
    /etc/postfix下 main.cf 配置文件详解
    Linux安装配置vsftp搭建FTP的详细配置
    Linux中ftp的常用命令
    javascript深入理解js闭包
  • 原文地址:https://www.cnblogs.com/webclz/p/3925064.html
Copyright © 2020-2023  润新知