您的位置:首页 > 其它

magento缓存系列详解:clean cache

2015-01-17 09:23 435 查看
cache是一个很大的概念,涉及的内容方方面面,magento cache是基于zend的,如果你对zend cache理解很深的话,相信magento cache也不再话下,本篇文章着重介绍Flush Magento Cache 和Flush Cache Storage 两个按钮的区别;



为了理解这两个选项之间的区别,你要先了解一些东西如缓存如何在 Magento 中工作。特别是要能准确的理解ids 和 tagging。

实质上,"id"就是一个唯一的字符串用来标识高速缓存中的共享存储的记录。tagging是另一个字符串,用于对不同类型的应用程序缓存的数据进行分类。
在 Magento中,tagging主要用于区分了以下的几个缓存类型:

[plain] view plaincopy

Configuration (non-layout XML files)

Layouts (all those XML files under app/design/…)

Blocks HTML output (Page blocks like headers, footers and callouts)

Translations

Collections Data

EAV types and attributes (reduces some database lookups)

Web Services Configuration

请看magento中默认的缓存文件列表存储示例:

[plain] view plaincopy

$ ls var/cache/mage--0

mage---1ef_DB_PDO_MYSQL_DDL_catalog_product_index_price_idx_1

mage---1ef_DB_PDO_MYSQL_DDL_core_config_data_1

mage---1ef_LAYOUT_0183D2D163E71FE45BB4CE3F4045A71BD

mage---1ef_LAYOUT_0659E64C667F785D2436DB04EBCBEE12E

mage---1ef_LAYOUT_088A9AF9EA75F3D59B57387F8E9C7D7A6

mage---1ef_LAYOUT_0956CDEF59F213D48A2D1218CC2CD1E96

mage---1ef_LAYOUT_1013A059DA3EFFB6F31EB8ABA68D0469E

mage---1ef_LAYOUT_12D7604E9632FF8D14B782A248FCBD2E7

mage---1ef_LAYOUT_14E2F46FB273D9CEA54FDD1B14EB28645

mage---1ef_LAYOUT_16CD0CCB23CB5ABE6844B7E3241F0A751

mage---1ef_LAYOUT_1DC0705D40BBC39A32179EE8A85BEF5D7

mage---1ef_Zend_LocaleC_en_US_day_gregorian_format_wide_wed

mage---1ef_Zend_LocaleC_en_US_month_gregorian_format_wide_5

正如您所看到的 ,根据缓存文件的文件名,可以区分出不同的缓存模式。
因为magento cache是基于zend cache的,所以magento的缓存文件也会有一个默认前缀mage,然后是一个id前缀(对app/etc/ 这个目录进行了一次md5 hash计算,然后取的前3个字符),然后是tag标记和其他一些标示符。整个字串就构成了缓存项的唯一一个id。
理解了以上内容,我们就很容易理解当你清除cache的时候,magento具体都做了什么。

“Flush Magento Cache”
当你点击“Flush Magento Cache”时,后台CacheController.php 调用了function flushSystemAction()。在这个function里,又调用了Mage_Core_Model_App 的cleanCache()这个function,然后又调用了Mage_Core_Model_Cache的clean($tags)这个function,我们先看下这个function的定义,或许能发现些什么:

[php] view plaincopy

/**

* Clean cached data by specific tag

*

* @param array $tags

* @return bool

*/

public function clean($tags=array())

{

$mode = Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG;

if (!empty($tags)) {

if (!is_array($tags)) {

$tags = array($tags);

}

$res = $this->_frontend->clean($mode, $this->_tags($tags));

} else {

$res = $this->_frontend->clean($mode, array(Mage_Core_Model_App::CACHE_TAG));

$res = $res && $this->_frontend->clean($mode, array(Mage_Core_Model_Config::CACHE_TAG));

}

return $res;

}

我们看到,在这个方法里它调用了zend cache对象的一些方法,但是要指出的是在这里会清除所有和参数$tags相匹配的cache,如果$tags为空,会执行else代码段,$tags 定义在 Mage_Core_Model_App 和Mage_Core_Model_Config,分别是MAGE和CONFIG,就是说会清除$tags为MAGE和CONFIG的所有cache。所以它并没有清除整个cache。
在看 Zend_Cache “clean()” function 定义之前, 先看下发生了什么事当点击另外一个按钮“Flush Cache Storage”的时候。

“Flush Cache Storage”
当你点击“Flush Cache Storage”时,后台CacheController.php 调用了function flushAllAction(),而不是前面提到的flushSystemAction(),然后这个方法同样会实例化一个Mage_Core_Model_App对象,但是他不在调用clean($tags),而是调用了flush(),看下这个function:

[php] view plaincopy

/**

* Clean cached data by specific tag

*

* @return bool

*/

public function flush()

{

$res = $this->_frontend->clean();

return $res;

}

喔喔,发现了没flush一样要调用zend cache对象的方法,但是有一个不同的是,这里的clean()没有传入任何参数;接下来去Zend_Cache_Core::clean() 看下到底发生了什么事,当没有传入参数$tags的时候。

[php] view plaincopy

/**

* Clean cache entries

*

* Available modes are :

* 'all' (default) => remove all cache entries ($tags is not used)

* 'old' => remove too old cache entries ($tags is not used)

* 'matchingTag' => remove cache entries matching all given tags

* ($tags can be an array of strings or a single string)

* 'notMatchingTag' => remove cache entries not matching one of the given tags

* ($tags can be an array of strings or a single string)

* 'matchingAnyTag' => remove cache entries matching any given tags

* ($tags can be an array of strings or a single string)

*

* @param string $mode

* @param array|string $tags

* @throws Zend_Cache_Exception

* @return boolean True if ok

*/

public function clean($mode = 'all', $tags = array())

{

if (!$this->_options['caching']) {

return true;

}

if (!in_array($mode, array(Zend_Cache::CLEANING_MODE_ALL,

Zend_Cache::CLEANING_MODE_OLD,

Zend_Cache::CLEANING_MODE_MATCHING_TAG,

Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG,

Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG))) {

Zend_Cache::throwException('Invalid cleaning mode');

}

self::_validateTagsArray($tags);

return $this->_backend->clean($mode, $tags);

可以看到,clean参数为空时,这里的$mode默认是all,就是会清除所有cache;
另外在后台Cache Storage Management,选择某一个或几个Cache Type,再refresh,原理其实就等同于“Flush Magento Cache”,这里的Cache Type就可以看做是传入的tag。

总结一下:“Flush Magento Cache” 将清除$tags为MAGE和CONFIG的cache,并非所有cache;“Flush Cache Storage” 不管有没有$tags所有的cache都会被清除;
另外需要注意的是,当magento使用默认的file来存储cache时,通常我们也可以用rm -rf var/cache/*来清除整个cache;但是如果不是用file存的cache,比如是xcache, memcached, apc, db, sqlite等等,“Flush Magento Cache”就可能会失效,因为memcached不支持tags,诸如此类的原因。此时“Flush Cache Storage”或许会更有效。

如果你使用共享缓存系统,如两个apps使用一块memcached,用“Flush Cache Storage”并不是一个明智的办法,所以要小心使用!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: