cache是一个很大的概念,涉及的内容方方面面,magento cache是基于zend的,如果你对zend cache理解很深的话,相信magento cache也不再话下,本篇文章着重介绍Flush Magento Cache 和Flush Cache Storage 两个按钮的区别;
为了理解这两个选项之间的区别,你要先了解一些东西如缓存如何在 Magento 中工作。特别是要能准确的理解ids 和 tagging。
实质上,"id"就是一个唯一的字符串用来标识高速缓存中的共享存储的记录。tagging是另一个字符串,用于对不同类型的应用程序缓存的数据进行分类。
在 Magento中,tagging主要用于区分了以下的几个缓存类型:
-
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中默认的缓存文件列表存储示例:
-
$ 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的定义,或许能发现些什么:
-
-
-
-
-
-
-
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:
-
-
-
-
-
-
public function flush()
-
{
-
$res = $this->_frontend->clean();
-
return $res;
-
}
喔喔,发现了没flush一样要调用zend cache对象的方法,但是有一个不同的是,这里的clean()没有传入任何参数;接下来去Zend_Cache_Core::clean() 看下到底发生了什么事,当没有传入参数$tags的时候。
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
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”并不是一个明智的办法,所以要小心使用!
(责任编辑:好模板) |