Magento Block的缓存机制

aheadworks公司的Blog插件可以算是Magento所有免费插件中最有名也是使用最广泛的一个插件了,就我自己来说,也是每个项目的必备插件(我一般用来做为新闻插件使用)。今天拿它做例子演示下给Block添加缓存(Cache)。

 

     

  这个截图是我某个项目使用aw_blog插件的实例,使用AW_Blog_Block_Blog这个block文件在首页输出某个新闻类别下的新闻列表,aw_blog插件本身是没给输出内容做过缓存处理的,也就是说,即便你一天或几天才更新一次新闻,页面每次载入时依然要从数据库里把这些数据取一遍,这个是比较没必要的。

下面来给这个Block加上缓存,Magento本身已经提供了一套给Block添加缓存的写法,只需要简单的加几句代码就可以

 

[php]  viewplain copy
  1. protected function _construct()  
  2.     {  
  3.         $this->addData(array(  
  4.             'cache_lifetime'=> 86400,  
  5.             'cache_tags'    => array(AW_Blog_Model_Post::CACHE_TAG)  
  6.         ));  
  7. }  

 

 

 

其中cache_lifetime指缓存周期,这里我设置的是86400秒,也就是一天,cache_tags指给该缓存设定的标签,这里我设置的是post这个model的一个常量。做完这一步,这个block文件的缓存就好了,页面载入时,这块内容不会再每次去数据库取数据,而是直接载入缓存好的html,减少了页面载入所消耗的时间。

到这一步,整个工作才完成了一半,为什么这么说呢?这里可以做个实验,在加完以上的代码并刷新过一次页面后,数据已经写进缓存文件里了,这时候去后台新增或修改一篇新闻,你会发现前台页面的内容并没有跟着改变,而是维持之前的内容。那么什么时候才会变成新的内容呢,一天之后,因为之前给缓存设置的有效时间是一天,一天之内的有效期内,页面都会去读取缓存文件而不是数据库。这时候你可以这样处理,在后台修改过内容后,手动刷新后台的缓存,让效果实时可见,或者用更好的方案,通过程序控制,在每次新闻内容新增或修改时自动刷新对应的缓存。

打开AW_Blog_Model_Post这个文件,在头部定义一个常量

 

[php]  viewplain copy
  1. const CACHE_TAG       = 'aw_blog';  

 

 

 

底部添加如下代码

 

[php]  viewplain copy
  1.  public function cleanCache()  
  2.    {  
  3.        Mage::app()->cleanCache(self::CACHE_TAG);  
  4.        return $this;  
  5.    }  
  6.      
  7.     public function _beforeSave(){  
  8.      $this->cleanCache();  
  9.   
  10.     return parent::_beforeSave();  
  11. }  

 

 

 

常量即是之前给Blog添加的缓存的cache_tags,_beforeSave函数是所有Model类继承自父类的方法,可以在该Model对应的对象实体保存数据时触发,这里重写_beforeSave,去调用一个cleanCache函数,cleanCache函数里只有一句重要的代码,就是Mage::app()->cleanCache(self::CACHE_TAG),这个方法可以清除指定标签(tag)的缓存,比如这里,它只会清除tag为aw_blog的缓存,而不是全部系统缓存。

从完整的流程来说,首先前台页面第一次载入时,该Block会将内容缓存进缓存文件,然后当后台保存新闻时,通过cleanCache会清除指定Tag的缓存,这之后再次载入页面时就会生成新的缓存文件。这样就做到了缓存新闻内容以提高速度的同时,依然可以在后台做出数据改变时在页面实时显示新的数据。

新闻数据在页面上一般所占空间不大,即使缓存起来可能也不会对加载速度有很明显的提升,这里只是以此为例子展示下Magento所提供的Block缓存机制。这个例子很简单,如果要对其他东西做缓存可能会有各种更复杂的流程,这里不再探讨。

PS:本文的前提是你在后台已经把Magento的缓存打开了


source: http://blog.sina.com.cn/s/blog_816730ea0101nhky.html

你可能感兴趣的:(Magento,magento,缓存)