閱讀754 返回首頁    go 阿裏雲 go 技術社區[雲棲]


實戰給AW_Blog插件添加緩存

            aheadworks公司的Blog插件可以算是Magento所有免費插件中最有名也是使用最廣泛的一個插件了,就我自己來說,也是每個項目的必備插件(我一般用來做為新聞插件使用)。今天拿它做例子演示下給Block添加緩存(Cache)。

    

   這個截圖是我某個項目使用aw_blog插件的實例,使用AW_Blog_Block_Blog這個block文件在首頁輸出某個新聞類別下的新聞列表,aw_blog插件本身是沒給輸出內容做過緩存處理的,也就是說,即便你一天或幾天才更新一次新聞,頁麵每次載入時依然要從數據庫裏把這些數據取一遍,這個是比較沒必要的。

下麵來給這個Block加上緩存,Magento本身已經提供了一套給Block添加緩存的寫法,隻需要簡單的加幾句代碼就可以

protected function _construct()
    {
        $this->addData(array(
            'cache_lifetime'=> 86400,
            'cache_tags'    => array(AW_Blog_Model_Post::CACHE_TAG)
        ));
}

其中cache_lifetime指緩存周期,這裏我設置的是86400秒,也就是一天,cache_tags指給該緩存設定的標簽,這裏我設置的是post這個model的一個常量。做完這一步,這個block文件的緩存就好了,頁麵載入時,這塊內容不會再每次去數據庫取數據,而是直接載入緩存好的html,減少了頁麵載入所消耗的時間。

到這一步,整個工作才完成了一半,為什麼這麼說呢?這裏可以做個實驗,在加完以上的代碼並刷新過一次頁麵後,數據已經寫進緩存文件裏了,這時候去後台新增或修改一篇新聞,你會發現前台頁麵的內容並沒有跟著改變,而是維持之前的內容。那麼什麼時候才會變成新的內容呢,一天之後,因為之前給緩存設置的有效時間是一天,一天之內的有效期內,頁麵都會去讀取緩存文件而不是數據庫。這時候你可以這樣處理,在後台修改過內容後,手動刷新後台的緩存,讓效果實時可見,或者用更好的方案,通過程序控製,在每次新聞內容新增或修改時自動刷新對應的緩存。

打開AW_Blog_Model_Post這個文件,在頭部定義一個常量

const CACHE_TAG       = 'aw_blog';

底部添加如下代碼

  public function cleanCache()
    {
        Mage::app()->cleanCache(self::CACHE_TAG);
        return $this;
    }
    
    	public function _beforeSave(){
      $this->cleanCache();

		return parent::_beforeSave();
	}

常量即是之前給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的緩存打開了得意

參考文章:https://www.magentocommerce.com/wiki/5_-_modules_and_development/block_cache_and_html_ouput

     

最後更新:2017-04-02 06:52:11

  上一篇:go JAVA麵試題-STRINGBUFFER倒序輸出、正則將首字母大寫
  下一篇:go jQuery Mobile 1.0 正式版發布