Magento在系统内的许多级别上使用了缓存,其中大多数对于不知情的开发人员是透明的。随着Magento任务的复杂性增加,不可避免的是,您最终将开始需要自己缓存。
我是在2010年7月Magento发布1.4版时第一次写这篇文章。此后,本文已针对1.7版进行了更新。
缓存概念
Magento中的缓存类似于许多其他系统,因为它是键值存储。如果我们希望将其保存$data
在缓存中,则必须使用名称来解决它$key
。当我们以后需要检索时$data
,将使用相同的方法进行检索$key
。
将$data
存储在缓存中,也可以标记与元数据。这允许对缓存条目进行逻辑分组以进行批量删除。
控制缓存
对于我们大多数人来说,我们第一次接触Magento的缓存是出于沮丧,而不是理解为什么我们完美形成的模块和模型不能仅仅因为发现“缓存已打开”而无法工作。
Magento提供了用于在管理区域中启用,禁用和刷新缓存的界面。“缓存管理”表中的每一行代表一个缓存标签。刷新这些行之一时,我们将删除带有特定标签的所有缓存条目。
缓存API
控制我们与缓存子系统的接口的模型是Mage_Core_Model_Cache
。通常,我们通过可访问的已实例化的对象访问缓存Mage::app()->getCache()
。
缓存的实现对我们来说是隐藏的,我们提供的接口(几乎完全)由以下方法组成:
save($value, $key, $tags = array(), $lifeTime=null)
load($key)
remove($key)
clean($tags = array()
用于缓存的实际后端可以是多种机制,从内置的平面文件方法(这是一种更有效的算法),到用于硬核的memcached,apc甚至redis。
储存价值
我们将从存储值开始。
<?php
$cache = Mage::app()->getCache();
$cache->save(date("r"), "nick_date", array("nicks_cache"), 10);
$cache->save("hello world - " . time(), "nick_helloworld", array("nicks_cache"), 60*60);
在上面的示例中,我指示缓存将当前日期的值与$key
nick_date一起存储。我们稍后可以使用键来参考该日期。我还存储短语的hello world - 601992000(对于给定的时间戳)与$key
nick_helloworld。
我们暂时将忽略标记nicks_cache,但是您会注意到与两个缓存条目关联的整数lifeTime值。这是该值在被删除之前将存在于缓存中的时间(以秒为单位)。通过将此值设置为null或省略参数,该值将保留在高速缓存中,直到删除。
取值
要从缓存中获取键的值,我们只需使用:
<?php $cache->load("nick_date");
如果该值在缓存中不存在,false
则将返回。
去除价值
要从缓存中删除单个值,我们使用:
<?php $cache->remove("nick_date");
您会注意到,我还将nicks_cache 应用于了$tag
最初存储的缓存条目。通过将标签应用于一组值,我可以稍后将它们全部引用以进行批量删除。我们这样做是:
<?php $cache->clean(array("nicks_cache"));
这将删除所有带有$tag
nicks_cache的缓存条目。