Magento缓存讲解之自定义缓存

来源:互联网 发布:厦门市大数据管理中心 编辑:程序博客网 时间:2024/06/03 17:44

Magento缓存讲解之自定义缓存

开发者都非常熟悉的 Magento缓存,都配备了非常完善的缓存管理机制。

众所周知,在 web领域中缓存的重要性,简单的说它可以使浏览者尽可能快地看到他们想看到的页面,一个载入速度非常迅速的页面对客户体验也是非常好的,因此也可能会直接或间接地增加您店铺的业绩。

Magento 缓存(FPC),它的位置在管理页面 system– configuration – cache management。

Magento缓存讲解之自定义缓存

它可以完全缓存静态页面和动态页面的绝大部分内容。但同样,当你的Magento 店铺需要特别的定制,你可能就需要扩展 Magento 的功能。作为电子商务开源程序提供商,Magento的其中一项重要业务就是 Magento Extension的出售。所以在这种情况下,您的自定义扩展就会在缓存中形成一个例外。

我想你懂我的意思。让我们来举个例子吧。比如,我们需要一个模块,它能够按照规律生成一个小型的产品列表,当然这是为不同浏览者的浏览爱好所定制的。这个块显示在主页上,那么我们就需要到管理页面选择CMS 主页,并插入下面的内容:

{{block type="mymodule/products" template="mymodule/products.phtml"}}

我们创建了块类,生成为每个客户收集的喜好特定产品的特殊逻辑(前提是该用户已经 拥有一个 ID并登陆)。那么你会认为这很容易,只要关闭缓存即可。但是,没了缓存,我们的页面载入速度势必会大打折扣,恐怕这都是你我所不愿意看到的。我们希望的是,即使这些是动态的,我们也要进行缓存,不仅仅包括我们的特殊模块,还包括所有客户将看到同样的东西。

听起来有些难,但这个难题还是被我们解决了。幸运的是 Magento的缓存机制是非常灵活的,有一个功能,我们可以称之为“hole”或者“placeholder”。它提供了一个能够在页面上定义将所有特殊东西缓存的逻辑,包括除默认部分以外不同的模块。

还是这个例子,让我们创建一个叫 cache.xml的文件,在这个模块的 etc 目录下:(和 config.xml 平行)

<?xml version="1.0" encoding="UTF-8"?>                    mymodule/productsHOMEPAGE_PRODUCTS          Rikku_Mymodule_Model_PageCache_Container_Homepageproducts          86400              

你可以看到,我们定义了一个 placeholder,将我们的块MyModule/products 分别用我们自己的类缓存:

<?phpclass Rikku_Mymodule_Model_PageCache_Container_Homepageproducts extends Enterprise_PageCache_Model_Container_Abstract    {        protected function _getIdentifier()    {        return $this->_getCookieValue(Enterprise_PageCache_Model_Cookie::COOKIE_CUSTOMER, '');    }        protected function _getCacheId()    {        return 'HOMEPAGE_PRODUCTS' . md5($this->_placeholder->getAttribute('cache_id') . $this->_getIdentifier());    }        protected function _renderBlock()    {        $blockClass = $this->_placeholder->getAttribute('block');        $template = $this->_placeholder->getAttribute('template');        $block = new $blockClass;        $block->setTemplate($template);        return $block->toHtml();    }}

详细地说明一下这个类:

protected function_renderBlock

该方法定义了我们的逻辑块中的缓存。实际上,我们这么做是告诉Magento ,我们定义的块、类、模板是默认的。

protected function_getCacheId

这是个有趣的方法,它定义了缓存的 ID,这将使缓存对特殊页一页一缓存。那么也到了关键的地方,因为我们不同的客户将看到不同的页面,那么也就是为每个缓存加上一个客户的ID,因此,我们设定唯一的前缀 HOMEPAGE_PRODUCTS ,然后调用方法,同时这也为我们区分不同的缓存 ID。

protected function_geIdentifier

这个地方,我们简单地检索了下cookie。

这样就可以了。现在,每个不同的客户都将看到属于他们的产品列表,并为缓存的页面做了一个版本号。

重要的提示:我们的产品列表实际上被完全缓存了,这意味着,客户虽然可以看到不同的产品列表,但我们增加产品或变更产品时,页面不会跟着变动。

但想到这点,所以才有了这个方法,您可以根据您的网店实际情况改写它,赋予每个缓存不同的 ID,那么当产品发生变化时,一个新的版本的缓存将被生成,那么前台,我们的客户也就可以看到产品的变化了。