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. SAP BDC说明

    简单说一下这个DBC,之前也一直在用,每次找记录都很麻烦,所以今天干脆就记下来吧 T-CODE:SHDB 输入个NAME,T-CODE.然后执行...最后用保存或者返回来结束录屏. 然后选择记录,创建 ...

  2. Quoted-printable 编码介绍、编码解码转换

    求教,“=B9=A4=D7=F7=BC=F2=B1=A8” 这种是什么编码方式? Quoted-printable 可译为“可打印字符引用编码”.“使用可打印字符的编码”,我们收邮件,查看信件原始信息 ...

  3. DOM中元素节点、属性节点、文本节点的理解

    DOM中元素节点.属性节点.文本节点的理解 节点信息 每个节点都拥有包含着关于节点某些信息的属性.这些属性是:nodeName(节点名称) nodeValue(节点值) nodeType(节点类型)  ...

  4. eclipse 安装git的插件和上传项目

    这里有个链接,已经很详细的写了过程  博客1以及博客2.其实遇到安装的问题,就是因为我用的eclipse版本比较老,但是eclipse里面又装了好多插件,不想在重新安装eclipse.还有一个很好的博 ...

  5. 学习记录012-NFS

    1.Network file System 主要是通过网络让不同的主机进行通信,构建于ip协议之上的现代文件系统,用来存储共享视频,图片,文件等 2.并发大的时候会有点问题(维护不好会丢数据) 3.N ...

  6. Js数据类型之——Date

    小猪曾经分享过一篇文章,主要是讲到后台使用c#将DataTime类型序列化到前台之后进行操作:具体请看传送门 今天小猪来分享在JS中的Data类型 类型说明 ECMAScript中的Data类型是在早 ...

  7. NSSet基础-初始化、获取元素、集合运算等

    代码: #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepo ...

  8. HDU 3076 ssworld VS DDD 概率dp,无穷级数,oj错误题目 难度:2

    http://acm.hdu.edu.cn/showproblem.php?pid=3076 不可思议的题目,总之血量越少胜率越高,所以读取时把两人的血量交换一下 明显每一轮的胜率和负率都是固定的,所 ...

  9. PictureWebHandler

    using System; using System.Configuration; using System.Drawing; using System.Drawing.Imaging; using ...

  10. opencv+ffmpeg实现avi视频的播放

    配了一天,终于成功的在ubuntu上安装了ffmpeg,实现了opencv对avi文件的读取. 在CvCapture* pCapture=cvCaptureFromAVI("video.av ...