Magento清除快取(clear cache)和建立快取(create cache)的方法
相信很多童鞋在做專案時常常會進行快取的儲存,這些快取有利也有弊,有時可能會出現當你做完一個功能的時候明明做的是對的,但是結果卻不是想要的,那麼這個時候就有可能是快取在作怪,可以通過手動清除快取,在magento後臺清除快取的位置在System->Cache Management->Flush Cache Storage,選中所要清除快取的位置清除快取,但是這種方法始終有侷限性,可能用程式碼清除快取可用性更強哦!這時候找到你所要清除的快取所在的建立快取的位置,例如:我自己做的專案中有一個是商品的收藏,當進入商品詳情頁的時候我是把商品做了快取,這時我做的收藏功能商品收藏之後再次進入該商品詳情頁卻得不到收藏狀態,這裡就是快取在作怪,下面就是我清除該處快取時的相關程式碼。
下面的是商品詳情頁做快取的程式碼:
$cacheTags = array();
$cacheKey = $this->getCacheKey() . '_' . $product_id;
$product_data= unserialize($this->loadCache($cacheKey));
$product = Mage::getModel('catalog/product')->load($product_id);
$cacheTags = $product->getCacheIdTags();
$this->saveCache(serialize($product_data), $cacheKey , $cacheTags);
當我在收藏商品的時候我就要清除該商品的快取,這樣才會得到更新後的資料,具體操作程式碼如下,在收藏商品save後清除快取:
$wishlist->save();
$cacheTags = $product->getCacheIdTags();
Mage::app()->cleanCache($cacheTags);
新增快取裡有兩個變數$cacheTags
和$cacheKey
,這兩個變數都是起到快取命名的作用,但是含義卻是完全不同的,其中$cacheKey
是唯一的key,每一個商品即使是相同的商品那麼在不同位置或介面作快取他的名字就是不一樣的,所以是唯一的,是一對一的。而$cacheTags
$cacheKey
清除快取那麼清除的是唯一商品的快取,而根據$cacheTags清除快取那麼清除的是一組的商品。
$cacheKey命名所使用的方法如下:
public function getCacheKey()
{
return 'MOBILE_CACHE_' .Mage::app()->getStore()->getId().'_'.$this->getUserCurrency().'_'.$this->getFullActionName();
}
第一部分是手動清除時顯示的快取存放的位置,第二部分是店鋪的ID,第三部分是當前貨幣的型別,第四部分是當前快取介面的路徑,第五部分是我自己加的$product_id商品ID,那麼打印出來就是:
MOBILE_CACHE_1_AED_mobile_v1_product_detial_14783
其中最後的數字是該商品的ID
$cacheTags命名所使用的方法如下在magento的核心檔案裡位置為Mage_Core_Model_Abstract:
public function getCacheIdTags()
{
$tags = false;
if ($this->getId() && $this->_cacheTag) {
$tags = array();
if (is_array($this->_cacheTag)) {
foreach ($this->_cacheTag as $_tag) {
$tags[] = $_tag.'_'.$this->getId();
}
} else {
$tags[] = $this->_cacheTag.'_'.$this->getId();
}
}
return $tags;
}
打印出來是:
Array
(
[0] => catalog_product_14403
)
這裡我所使用的清除快取的方法是:
public function cleanCache($tags=array())
{
$this->_cache->clean($tags);
Mage::dispatchEvent('application_clean_cache', array('tags' => $tags));
return $this;
}
清除快取說完了,不能只會清除快取,還要會建立快取,下面再說一下建立快取的方法:
$cacheTags = array();
$cacheKey = $this->getCacheKey() . '_flash_sales_' . $page_size. '_' . $page_index;
$data = unserialize($this->loadCache($cacheKey));
if(!$data) {
/*
相關要做快取的資料
*/
$data[] = ...; //數組裡面放入的是該方法中涉及到的相關資料
$this->saveCache(serialize($data), $cacheKey, $cacheTags, 1800);
}