YII自学笔记(三)

缓存
数据缓存
缓存组件的基类 CCache 提供了两个最常用的方法: set() 和 get();
1.设置缓存数据
// 值 value30Yii::app()>cache>set( id, $value, 30);

        2.获取缓存
            $value=Yii::app()->cache->get($id);

    缓存依赖 
        除了过期设置,缓存数据也可能会因为依赖条件发生变化而失效。例如,如果我们缓存了某些文件的内容,而这些文件发生了改变,我们就应该让缓存的数据失效, 并从文件中读取最新内容而不是从缓存中读取。

        我们将一个依赖关系表现为一个 CCacheDependency 或其子类的实例。 当调用 set() 时,我们连同要缓存的数据将其一同传入。

        // 此值将在30秒后失效
        // 也可能因依赖的文件发生了变化而更快失效
        Yii::app()->cache->set($id, $value, 30, new CFileCacheDependency('FileName'));
        如下是可用的缓存依赖的简要说明:
            CFileCacheDependency: 如果文件的最后修改时间发生改变,则依赖改变。
            CDirectoryCacheDependency: 如果目录和其子目录中的文件发生改变,则依赖改变。
            CDbCacheDependency: 如果指定 SQL 语句的查询结果发生改变,则依赖改变。
            CGlobalStateCacheDependency: 如果指定的全局状态发生改变,则依赖改变。全局状态是应用中的一个跨请求,跨会话的变量。它是通过 CApplication::setGlobalState() 定义的。
            CChainedCacheDependency: 如果链中的任何依赖发生改变,则此依赖改变。
            CExpressionDependency: 如果指定的 PHP 表达式的结果发生改变,则依赖改变。

片段缓存
    要使用片段缓存,在控制器视图脚本中调用CController::beginCache() 和CController::endCache() 是[ COutputCache ]widget的包装。这两种方法开始和结束包括的页面内容将被缓存。类似data caching ,我们需要一个编号,识别被缓存的片段。
    ...别的HTML内容...
    <?php if($this->beginCache($id)) { ?>
    ...被缓存的内容...
    <?php $this->endCache(); } ?>
    ...别的HTML内容...
    在上面的,如果beginCache() 返回false,缓存的内容将此地方自动插入; 否则,在if语句内的内容将被执行并在endCache()触发时缓存。
    1.缓存选项
        可以通过duration设置有效期,比如设置一个小时
            ...其他HTML内容...
            <?php if($this->beginCache($id, array('duration'=>3600))) { ?>
            ...被缓存的内容...
            <?php $this->endCache(); } ?>
            ...其他HTML内容...
        可以通过建立dependency实现CDbCacheDependency对象或者用于生成依赖对象的配置数组。如下代码指定内容取决于lastModified值是否变化
            ...其他HTML内容...
            <?php if($this->beginCache($id, array('dependency'=>array(
                    'class'=>'system.caching.dependencies.CDbCacheDependency',
                    'sql'=>'SELECT MAX(lastModified) FROM Post')))) { ?>   
            ...被缓存的内容...
            <?php $this->endCache(); } ?>
            ...其他HTML内容...
        变化
            缓存的内容可根据一些参数变化。例如,每个人的档案都不一样。缓存的档案内容将根据每个人ID变化。这意味着,当调用beginCache()时将用不同的ID。
            COutputCache内置了这一特征,程序员不需要编写根据ID变动内容的模式。以下是内置的变动内容
                varyByRoute: 设置此选项为true ,缓存的内容将根据route变化。因此,每个控制器和行动的组合将有一个单独的缓存内容。
                varyBySession: 设置此选项为true ,缓存的内容将根据session ID变化。因此,每个用户会话可能会看到由缓存提供的不同内容。
                varyByParam: 设置此选项的数组里的名字,缓存的内容将根据GET参数的值变动。例如,如果一个页面显示文章的内容根据id的GET参数,我们可以指定varyByParam为array('id'),以使我们能够缓存每篇文章内容。如果没有这样的变化,我们只能能够缓存某一文章。
                varyByExpression:缓存根据PHP表达式的结果变量。
        请求类型缓存
            我们可以指定requestTypes 选项:比如缓存GET请求结果
            ...其他HTML内容...
            <?php if($this->beginCache($id, array('requestTypes'=>array('GET')))) { ?>
            ...被缓存的内容...
            <?php $this->endCache(); } ?>
            ...其他HTML内容..

    2.嵌套缓存
        片段缓存可以嵌套缓存
        ..其他HTML内容...
        <?php if($this->beginCache($id1)) { ?>
        ...外部被缓存内容...
            <?php if($this->beginCache($id2)) { ?>
            ...内部被缓存内容...
            <?php $this->endCache(); } ?>
        ...外部被缓存内容...
        <?php $this->endCache(); } ?>
        ...其他HTML内容...
        注:外部缓存失效,内部缓存依然可以提供有效缓存
            外部缓存有效,但是内部缓存无效,则内部缓存永远是内部缓存副本。

页面缓存  (内容涉及到前端,资料过少,可通过项目熟悉)
    过滤器设置
        public function filters()
        {
            return array(
                array(
                    'COutputCache',
                    'duration'=>100,
                    'varyByParam'=>array('id'),
                ),
            );
        }


动态内容:
当静态类容中部分需要动态显示时候,可以通过CController::renderDynamic()实现,如下
    ...别的HTML内容...
    <?php if($this->beginCache($id)) { ?>
    ...被缓存的片段内容...
        <?php $this->renderDynamic($callback); ?>
    ...被缓存的片段内容...
    <?php $this->endCache(); } ?>
    ...别的HTML内容...
这其中$callback指的是有效的PHP回调。它可以是指向当前控制器类的方法或者全局函数的字符串名。它也可以是一个数组名指向一个类的方法。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值