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

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

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

  1. Configuration (non-layout XML files)
  2. Layouts (all those XML files under app/design/…)
  3. Blocks HTML output (Page blocks like headers, footers and callouts)
  4. Translations
  5. Collections Data
  6. EAV types and attributes (reduces some database lookups)
  7. Web Services Configuration

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

  1. $ ls var/cache/mage--0
  2. mage---1ef_DB_PDO_MYSQL_DDL_catalog_product_index_price_idx_1
  3. mage---1ef_DB_PDO_MYSQL_DDL_core_config_data_1
  4. mage---1ef_LAYOUT_0183D2D163E71FE45BB4CE3F4045A71BD
  5. mage---1ef_LAYOUT_0659E64C667F785D2436DB04EBCBEE12E
  6. mage---1ef_LAYOUT_088A9AF9EA75F3D59B57387F8E9C7D7A6
  7. mage---1ef_LAYOUT_0956CDEF59F213D48A2D1218CC2CD1E96
  8. mage---1ef_LAYOUT_1013A059DA3EFFB6F31EB8ABA68D0469E
  9. mage---1ef_LAYOUT_12D7604E9632FF8D14B782A248FCBD2E7
  10. mage---1ef_LAYOUT_14E2F46FB273D9CEA54FDD1B14EB28645
  11. mage---1ef_LAYOUT_16CD0CCB23CB5ABE6844B7E3241F0A751
  12. mage---1ef_LAYOUT_1DC0705D40BBC39A32179EE8A85BEF5D7
  13. mage---1ef_Zend_LocaleC_en_US_day_gregorian_format_wide_wed
  14. 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的定义,或许能发现些什么:

  1. /**
  2. * Clean cached data by specific tag
  3. *
  4. * @param   array $tags
  5. * @return  bool
  6. */
  7. public function clean($tags=array())
  8. {
  9. $mode = Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG;
  10. if (!empty($tags)) {
  11. if (!is_array($tags)) {
  12. $tags = array($tags);
  13. }
  14. $res = $this->_frontend->clean($mode, $this->_tags($tags));
  15. } else {
  16. $res = $this->_frontend->clean($mode, array(Mage_Core_Model_App::CACHE_TAG));
  17. $res = $res && $this->_frontend->clean($mode, array(Mage_Core_Model_Config::CACHE_TAG));
  18. }
  19. return $res;
  20. }

我们看到,在这个方法里它调用了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:

  1. /**
  2. * Clean cached data by specific tag
  3. *
  4. * @return  bool
  5. */
  6. public function flush()
  7. {
  8. $res = $this->_frontend->clean();
  9. return $res;
  10. }

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

  1. /**
  2. * Clean cache entries
  3. *
  4. * Available modes are :
  5. * 'all' (default)  => remove all cache entries ($tags is not used)
  6. * 'old'            => remove too old cache entries ($tags is not used)
  7. * 'matchingTag'    => remove cache entries matching all given tags
  8. *                     ($tags can be an array of strings or a single string)
  9. * 'notMatchingTag' => remove cache entries not matching one of the given tags
  10. *                     ($tags can be an array of strings or a single string)
  11. * 'matchingAnyTag' => remove cache entries matching any given tags
  12. *                     ($tags can be an array of strings or a single string)
  13. *
  14. * @param  string       $mode
  15. * @param  array|string $tags
  16. * @throws Zend_Cache_Exception
  17. * @return boolean True if ok
  18. */
  19. public function clean($mode = 'all', $tags = array())
  20. {
  21. if (!$this->_options['caching']) {
  22. return true;
  23. }
  24. if (!in_array($mode, array(Zend_Cache::CLEANING_MODE_ALL,
  25. Zend_Cache::CLEANING_MODE_OLD,
  26. Zend_Cache::CLEANING_MODE_MATCHING_TAG,
  27. Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG,
  28. Zend_Cache::CLEANING_MODE_MATCHING_ANY_TAG))) {
  29. Zend_Cache::throwException('Invalid cleaning mode');
  30. }
  31. self::_validateTagsArray($tags);
  32. 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”并不是一个明智的办法,所以要小心使用!

magento缓存系列详解:clean cache的更多相关文章

  1. 浏览器 HTTP 协议缓存机制详解

    最近在准备优化日志请求时遇到了一些令人疑惑的问题,比如为什么响应头里出现了两个 cache control.为什么明明设置了 no cache 却还是发请求,为什么多次访问时有时请求里带了 etag, ...

  2. nginx平台初识(二) 浏览器 HTTP 协议缓存机制详解

    1.缓存的分类 缓存分为服务端侧(server side,比如 Nginx.Apache)和客户端侧(client side,比如 web browser). 服务端缓存又分为 代理服务器缓存 和 反 ...

  3. 《深入理解mybatis原理6》 MyBatis的一级缓存实现详解 及使用注意事项

    <深入理解mybatis原理> MyBatis的一级缓存实现详解 及使用注意事项 0.写在前面   MyBatis是一个简单,小巧但功能非常强大的ORM开源框架,它的功能强大也体现在它的缓 ...

  4. 浏览器 HTTP 协议缓存机制详解--网络缓存决策机制流程图

    1.缓存的分类 2.浏览器缓存机制详解 2.1 HTML Meta标签控制缓存 2.2 HTTP头信息控制缓存 2.2.1 浏览器请求流程 2.2.2 几个重要概念解释 3.用户行为与缓存 4.Ref ...

  5. MyBatis 一级缓存、二级缓存全详解(一)

    目录 MyBatis 一级缓存.二级缓存全详解(一) 什么是缓存 什么是MyBatis中的缓存 MyBatis 中的一级缓存 初探一级缓存 探究一级缓存是如何失效的 一级缓存原理探究 还有其他要补充的 ...

  6. QAction系列详解

    QAction系列详解 一.QAction类详解 [详细描述] QAction类提供了抽象的用户界面action,这些action可以被放置在窗口部件中.        应用程序可以通过菜单,工具栏按 ...

  7. Redis for Windows(C#缓存)配置文件详解

    Redis for Windows(C#缓存)配置文件详解   前言 在上一篇文章中主要介绍了Redis在Windows平台下的下载安装和简单使用http://www.cnblogs.com/aehy ...

  8. MySQL系列详解八:MySQL多线程复制演示-技术流ken

    前言 Mysql 采用多线程进行复制是从 Mysql 5.6 开始支持的内容,但是 5.6 版本下有缺陷,虽然支持多线程,但是每个数据库只能一个线程,也就是说如果我们只有一个数据库,则主从复制时也只有 ...

  9. PHP缓存机制详解

    一,PHP缓存机制详解 我们可以使用PHP自带的缓存机制来完成页面静态化,但是仅靠PHP自身的缓存机制并不能完美的解决页面静态化,往往需要和其他静态化技术(通常是伪静态技术)结合使用. output ...

随机推荐

  1. windows系统下Tomcat与Apache服务器集成

    说明:此文是看书真实试验成功的,书中提到了不同版本不兼容的问题,但是很荣幸我没碰到,此例可供参考. 本文假设你已经有了java环境和tomcat,你已经熟悉tomcat的应用. Jdk 1.7.0_5 ...

  2. mybatis 语句共享

    在mybatis mapping文件中,有些情况下有些语句需要共享给其他sql语句使用. 在网上搜了一下没有结果. 自己动手做了一个单元测试. 示例如下: 比如我在sysuser.xml 中有如下语句 ...

  3. qml 相关的博客

    http://qt-project.org/wiki/SpaceAppsChallengeResources http://www.ics.com/blog https://www.ics.com/d ...

  4. [Js]弹性运动

    描述:像弹簧一样左右弹动,最后缓慢停下来 一.加减速运动 1.加速运动 var iSpeed=0;iSpeed++; 速度越来越快,最后冲出去 2.减速运动 var iSpeed=20;iSpeed- ...

  5. 互斥锁pthread_mutex_t的使用(转载)

    1. 互斥锁创建        有两种方法创建互斥锁,静态方式和动态方式.POSIX定义了一个宏PTHREAD_MUTEX_INITIALIZER来静态初始化互斥锁,方法如下: pthread_mut ...

  6. POJ 2480 求每一个数对于n的最大公约数的和

    这里是枚举每一个最大公约数p,那么最后求的是f(n) = sigma(p*phi(n/p))    phi()为欧拉函数 这里可以试着算一下,然后会发现这个是积性函数的 那么只要考虑每一类质数分开算, ...

  7. mysql 导入数据库文件到指定数据库

    i:\mysql\bin>mysql  -u  用户名 -p  数据库名  <   i:/test.sql // (source "c:\adsense.sql" ) ...

  8. Thread IsBcakgroud

    C#中,Thread类有一个IsBackground 的属性.MSDN上对它的解释是:获取或设置一个值,该值指示某个线程是否为后台线程.个人感觉这样的解释等于没有解释. .Net中的线程,可以分为后台 ...

  9. 苹果 Mac OS X Yosemite 10.10 新功能特性总结 - 扁平化、主打跨设备的无缝连通性

    苹果在2014.06.03凌晨的 WWDC 2014 大会上正式发布了最新的 OS X Yosemite 桌面操作系统和 iOS 8 移动系统.虽然整场发布会的重心都在软件上,并没有硬件亮相,但软件上 ...

  10. poj3667 线段树 区间合并

    //Accepted 3728 KB 1079 ms //线段树 区间合并 #include <cstdio> #include <cstring> #include < ...