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. HDU4815

    Little Tiger vs. Deep Monkey Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K ( ...

  2. PL/SQL设置编码方式

    (2012-10-30 21:38:33) 转载▼ 标签: 杂谈 分类: ORACLE 导出sql文件出现乱码问题,百度之后,发现问题是由于PL/SQL客户端和ORACLE的字符编码设置不一致引起的. ...

  3. FZU 2027 单词问题 map标记字符串典型问题

    题目链接:单词问题 找一个字符串里的所有单词,重复的只输出一次.关于map函数key值是字符串的问题一直比较含糊... 挣扎了一番,大概是,map的key值是char型数组的时候,标记的是地址,于是有 ...

  4. function gzdecode

    function gzdecode($data) { return gzinflate(substr($data,10,-8)); } 因为项目要下载一个gzip压缩的网页,所以需要解压,手册上有一个 ...

  5. visual studio 2013连接Oracle 11g并获取数据:(一:环境搭建)

    C# WinForm案例: 目标: visual studio 中点击按钮,就可获取到Oracle中数据表的内容 1.安装Visual Studio 2013 ,推荐如下网址,下载ISO镜像,一路ne ...

  6. Pjax的使用

    什么是pjax? 现在很多网站( facebook,  twitter)都支持这样的一种浏览方式, 当你点击一个站内的链接的时候, 不是做页面跳转, 而是只是站内页面刷新. 这样的用户体验, 比起整个 ...

  7. ASP.NET MVC过滤器(一)

    MVC过滤器是加在 Controller 或 Action 上的一种 Attribute,通过过滤器,MVC 网站在处理用户请求时,可以处理一些附加的操作,如:用户权限验证.系统日志.异常处理.缓存等 ...

  8. Android Phonebook编写联系人UI加载及联系人保存流程(五)

    2014-01-07 10:46:30 将百度空间里的东西移过来. 在前面的文章中我们分析了UI的加载,其中提到了一个重要的对象:RawContactDeltaList mState,我前面说过这个对 ...

  9. Sublime Text 3 插件安装

    1.安装 Package Control 组件 sublime菜单栏->view->show console: 输入以下命令回车: import urllib.request,os; pf ...

  10. FZU 2082 过路费

    树链剖分模板题 #include <cstdio> #include <iostream> #include <cstring> #include <algo ...