在知道缓存机制前,首先需要知道,Magento的路由机制,这边就不做赘述了,百度一大堆。

下面一个简单的缓存生效流程:

A:首先在页面开始时,
Magento在app\code\core\Mage\Core\Model\App.php的run函数里

//可以看到一个判断条件,根据请求地址,判断是否有缓存命中,若中,则直接返回缓存
if ($this->_cache->processRequest()) {
$this->getResponse()->sendResponse();
} else {
//生成modules,config的缓存
$this->_initModules();
//生成translate的缓存
       $this->loadAreaPart(Mage_Core_Model_App_Area::AREA_GLOBAL, Mage_Core_Model_App_Area::PART_EVENTS);
if ($this->_config->isLocalConfigLoaded()) {
$scopeCode = isset($params['scope_code']) ? $params['scope_code'] : '';
$scopeType = isset($params['scope_type']) ? $params['scope_type'] : 'store';
$this->_initCurrentStore($scopeCode, $scopeType);
$this->_initRequest();
Mage_Core_Model_Resource_Setup::applyAllDataUpdates();
} $this->getFrontController()->dispatch();
}

之后经由路由匹配分发,进入控制器,在控制器里,会加载layout层

C:Layout层的缓存在Mage_Core_Controller_Varien_Action类的loadLayoutUpdates里

//调用Mage_Core_Model_Layout_Update类的load函数
public function load($handles=array())
{
if (is_string($handles)) {
$handles = array($handles);
} elseif (!is_array($handles)) {
throw Mage::exception('Mage_Core', Mage::helper('core')->__('Invalid layout update handle'));
} foreach ($handles as $handle) {
$this->addHandle($handle);
} if ($this->loadCache()) {
return $this;
} foreach ($this->getHandles() as $handle) {
$this->merge($handle);
} $this->saveCache();
return $this;
}

经由Layout加载block,同时输出其对应的template。

D:View层的缓存是在Block抽象类:Mage_Core_Block_Abstract的toHtml()里

Mage::dispatchEvent('core_block_abstract_to_html_before', array('block' => $this));
if (Mage::getStoreConfig('advanced/modules_disable_output/' . $this->getModuleName())) {
return '';
}
//简单明了,页面渲染出来前,加载是否有缓存
$html = $this->_loadCache();
if ($html === false) {
$translate = Mage::getSingleton('core/translate');
/** @var $translate Mage_Core_Model_Translate */
if ($this->hasData('translate_inline')) {
$translate->setTranslateInline($this->getData('translate_inline'));
} $this->_beforeToHtml();
$html = $this->_toHtml();
//在页面生成后,同时保存缓存
$this->_saveCache($html); if ($this->hasData('translate_inline')) {
$translate->setTranslateInline(true);
}
}

E:最后Model层的缓存则比较有意思,

首先是Model的抽象类Mage_Core_Model_Abstract里的

//可以看到,每当model类执行保存和删除操作时,都会执行清楚缓存操作
protected function _afterSave()
{
$this->cleanModelCache();
Mage::dispatchEvent('model_save_after', array('object'=>$this));
Mage::dispatchEvent($this->_eventPrefix.'_save_after', $this->_getEventData());
return $this;
} protected function _beforeDelete()
{
Mage::dispatchEvent('model_delete_before', array('object'=>$this));
Mage::dispatchEvent($this->_eventPrefix.'_delete_before', $this->_getEventData());
$this->cleanModelCache();
return $this;
}

上面是清除缓存操作(购物车更新,下订单之类,都会触发这个),那么Model层的缓存是在哪里加入的?

Mage_Core_Model_Resource_Db_Collection_Abstract抽象类的getData()会触发数据缓存保存:

还有一个就是Mage_Eav_Model_Entity_Collection_Abstract类的load()操作,

这两个类都继承自Varien_Data_Collection_Db,会调用其_fetchAll()

 //被以上两个函数调用
protected function _fetchAll($select)
{
if ($this->_canUseCache()) {
$data = $this->_loadCache($select);
if ($data) {
$data = unserialize($data);
} else {
$data = $this->getConnection()->fetchAll($select, $this->_bindParams);
$this->_saveCache($data, $select);
}
} else {
$data = $this->getConnection()->fetchAll($select, $this->_bindParams);
}
return $data;
}

比对下magento后台的几种缓存:

Magento 缓存机制简析的更多相关文章

  1. Linux VFS机制简析(二)

    Linux VFS机制简析(二) 接上一篇Linux VFS机制简析(一),本篇继续介绍有关Address space和address operations.file和file operations. ...

  2. Linux VFS机制简析(一)

    Linux VFS机制简析(一) 本文主要基于Linux内核文档,简单分析Linux VFS机制,以期对编写新的内核文件系统(通常是给分布式文件系统编写内核客户端)的场景有所帮助. 个人渊源 切入正文 ...

  3. Linux内存管理机制简析

    Linux内存管理机制简析 本文对Linux内存管理机制做一个简单的分析,试图让你快速理解Linux一些内存管理的概念并有效的利用一些管理方法. NUMA Linux 2.6开始支持NUMA( Non ...

  4. Binder机制简析(三)

    注册Service Service组件运行在Server进程中,首先要将Service注册到Service Manager中,再启动一个Binder线程池来等待和处理Client的通信请求. 注册过程 ...

  5. Unity - 存读档机制简析

    本文旨在于简要分析Unity中的两种存档机制,即:PlayerPrefs数据持久化方法及Serialization数据序列化方法 较比与源项目,我另加了JSON方法.XML方法等及一些Unity设置, ...

  6. Linux内核poll/select机制简析

    0 I/O多路复用机制 I/O多路复用 (I/O multiplexing),提供了同时监测若干个文件描述符是否可以执行IO操作的能力. select/poll/epoll 函数都提供了这样的机制,能 ...

  7. DPDK多核多线程机制简析

    DPDK通过在多核设备上,创建多个线程,每个线程绑定到单独的核上,减少线程调度的开销,以提高性能. DPDK的线程分为控制线程和数据线程,控制线程一般绑定到MASTER核上,主要是接受用户配置,并传递 ...

  8. linux-2.6.38poll机制简析(以tiny6410按键中断程序为基础)

    一.应用程序 /* struct pollfd { int fd; //文件描述符 short events; //表示请求检测的事件 short revents; //表示检测之后返回的事件 }; ...

  9. 简析 .NET Core 构成体系

    简析 .NET Core 构成体系 Roslyn 编译器 RyuJIT 编译器 CoreCLR & CoreRT CoreFX(.NET Core Libraries) .NET Core 代 ...

随机推荐

  1. 《STL源代码剖析》---stl_deque.h阅读笔记(2)

    看完,<STL源代码剖析>---stl_deque.h阅读笔记(1)后.再看代码: G++ 2.91.57,cygnus\cygwin-b20\include\g++\stl_deque. ...

  2. LeetCode(26)题解:Remove Duplicates from Sorted Array

    https://leetcode.com/problems/remove-duplicates-from-sorted-array/ Given a sorted array, remove the ...

  3. 事件序列化器 Flume 的无数据丢失保证,Channel 和事务

    小结: 1.Flume 的持久性保证依赖于使用的持久性Channel 的保证 通过事件序列化器将Flume事件转化为外部存储格式 主要的事件序列化器: 1.文本 2.带有头信息的文本 3.Avro序列 ...

  4. Axure Base 09 带遮罩层的弹出框

    示例原型下载:小楼Axure原创元件-带遮罩层的弹出框 实现目标: 1.   点击按钮弹出带遮罩层的对话框: 2.   页面上下左右滚动时,弹出的对话框水平和垂直始终居中. 实现步骤如下: 1. 拖入 ...

  5. 深入解析Hibernate核心接口

    Hibernate有很多值得学习的地方,这里我们主要介绍Hibernate核心接口,包括介绍SessionFactory接口.Query和Criteria接口等方面. Session 接口对于Hibe ...

  6. js 时间戳精确值的问题

    最近做一个多图上传的功能,通过name + 时间戳命名,结果发现时间戳竟然一样,一直以为是代码逻辑的问题,结果出错在时间戳的获取上了. 关于时间戳的获取方式: 1.Date.parse() var d ...

  7. javascript查找子节点时,html里的换行可能会被当成节点

    1.直接去HTML里找到该换行的地方去掉换行 2.写一个方法把元素类型为空格而且是文本都删除 function del_ff(elem){ var elem_child = elem.childNod ...

  8. spring cloud 服务消费

    Ribbon Ribbon可以在通过客户端中配置的ribbonServerList服务端列表去轮询访问以达到均衡负载的作用. 当Ribbon与Eureka联合使用时,ribbonServerList会 ...

  9. HDU 5651xiaoxin juju needs help

    xiaoxin juju needs help Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/ ...

  10. I2C测试【转】

    本文转载自: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 ...