magento缓存系列详解:clean cache
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的定义,或许能发现些什么:
- /**
- * 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:
- /**
- * 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的时候。
- /**
- * 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”并不是一个明智的办法,所以要小心使用!
magento缓存系列详解:clean cache的更多相关文章
- 浏览器 HTTP 协议缓存机制详解
最近在准备优化日志请求时遇到了一些令人疑惑的问题,比如为什么响应头里出现了两个 cache control.为什么明明设置了 no cache 却还是发请求,为什么多次访问时有时请求里带了 etag, ...
- nginx平台初识(二) 浏览器 HTTP 协议缓存机制详解
1.缓存的分类 缓存分为服务端侧(server side,比如 Nginx.Apache)和客户端侧(client side,比如 web browser). 服务端缓存又分为 代理服务器缓存 和 反 ...
- 《深入理解mybatis原理6》 MyBatis的一级缓存实现详解 及使用注意事项
<深入理解mybatis原理> MyBatis的一级缓存实现详解 及使用注意事项 0.写在前面 MyBatis是一个简单,小巧但功能非常强大的ORM开源框架,它的功能强大也体现在它的缓 ...
- 浏览器 HTTP 协议缓存机制详解--网络缓存决策机制流程图
1.缓存的分类 2.浏览器缓存机制详解 2.1 HTML Meta标签控制缓存 2.2 HTTP头信息控制缓存 2.2.1 浏览器请求流程 2.2.2 几个重要概念解释 3.用户行为与缓存 4.Ref ...
- MyBatis 一级缓存、二级缓存全详解(一)
目录 MyBatis 一级缓存.二级缓存全详解(一) 什么是缓存 什么是MyBatis中的缓存 MyBatis 中的一级缓存 初探一级缓存 探究一级缓存是如何失效的 一级缓存原理探究 还有其他要补充的 ...
- QAction系列详解
QAction系列详解 一.QAction类详解 [详细描述] QAction类提供了抽象的用户界面action,这些action可以被放置在窗口部件中. 应用程序可以通过菜单,工具栏按 ...
- Redis for Windows(C#缓存)配置文件详解
Redis for Windows(C#缓存)配置文件详解 前言 在上一篇文章中主要介绍了Redis在Windows平台下的下载安装和简单使用http://www.cnblogs.com/aehy ...
- MySQL系列详解八:MySQL多线程复制演示-技术流ken
前言 Mysql 采用多线程进行复制是从 Mysql 5.6 开始支持的内容,但是 5.6 版本下有缺陷,虽然支持多线程,但是每个数据库只能一个线程,也就是说如果我们只有一个数据库,则主从复制时也只有 ...
- PHP缓存机制详解
一,PHP缓存机制详解 我们可以使用PHP自带的缓存机制来完成页面静态化,但是仅靠PHP自身的缓存机制并不能完美的解决页面静态化,往往需要和其他静态化技术(通常是伪静态技术)结合使用. output ...
随机推荐
- MATLAB实现矩阵分块相乘
要实现一下功能,这里$\bf{x}_i$为行向量 $${\bf{A}} = \left[ \begin{array}{l}{{\bf{x}}_1}\\{{\bf{x}}_2}\end{array} \ ...
- [python学习]结合开源库学习python
代码碎片1 #!/usr/bin/python # please add your code here! import matplotlib matplotlib.use('Agg') import ...
- ajax异步加载小例子....(通俗易懂)
web.html(用户端): <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...
- PHP换行符详解 PHP_EOL,<br />
1.PHP_EOL:用于文本的换行符,经常用于日志文件记录.可以解决: 在windows中\r\n是换行在Mac中\r是换行在Liunx中\n是换行 不统一的问题. 2. <br /> : ...
- git 将本地项目添加到远程
git init git add README.md git commit -m "first commit" git remote add origin git@github.c ...
- ORACLE 日期比较
oracle sql日期比较:在今天之前: select * from up_date where update < to_date('2007-09-07 00:00:00','yyyy-mm ...
- VBA读取固定文件夹中txt内容
Sub OneTxt() '打开一个txt文件 Dim Filename As Variant, extLine&, mArr() As String Dim i%, j%, txtpath ...
- [转]AndroidTolls国内镜像
AndroidDevTools简介 Android Dev Tools官网地址:www.androiddevtools.cn 收集整理Android开发所需的Android SDK.开发中用到的工具. ...
- 上次遗留下来的XMLUtil的问题
·在上周留下了一个关于XMLUtil的问题,问题大概是这样的,需要通过读取一个XML文件,然后在内存中生成一个对应的javaBean.之前写的那个很是糟糕,照着一个XML去写了一个"Util ...
- == 和 isEqualToString的区别之备忘
== 比较的是指针 isEqualToString 比较的是指针指向的内容 比如: NSString * strA = @"abc"; NSString * strB = @&qu ...