實戰給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