Magento 是一个极其灵活的电子商务框架,但这种灵活性是有代价的:性能。这个答案是指针的集合和一些关于缓存的细节(特别是对于块)。
要考虑的一件事是 Magento 环境,例如调整 php、web 服务器(更喜欢 nginx 而不是 Apache)和 MySQL。另外,为 Magento 设置一个好的缓存后端。所有这些都包括在内,例如在同样适用于 CE 的Magento Performance Whitepaper 中。
环境搭建好之后,另一面就是代码了。
通过启用平面表目录(系统 > 配置 > 目录 > 前端)可以减少某些页面的查询数量,但您将始终有大量查询。
除了调整环境(APC、内存、CPU)之外,您也无法真正减少创建块所花费的时间。因此,正如其他评论者所说,您最好的选择是利用 Magento 内置的缓存功能。
Magento 块缓存
因为您在问题中特别提到了块,所以我将详细说明块缓存。块缓存受三个属性控制:
- cache_lifetime
- cache_key
- 缓存标签
所有这些属性都可以在块的_construct() 方法中使用 setData() 或魔法设置器设置,或者通过实现相关的 getter 方法(getCacheLifetime()、getCacheKey()、getCacheTags())来设置。
cache_lifetime 以(整数)秒为单位。如果将其设置为false(boolean),则该块将被永久缓存(不会过期)。如果设置为null,则不会缓存块(这是Mage_Core_Block_Abstract中的默认值)。
cache_key 是用于标识缓存池中的缓存记录的唯一字符串。默认情况下,它由getCacheKeyInfo() 方法返回的数组构成。
// Mage_Core_Block_Abstract
public function getCacheKeyInfo()
{
return array(
$this->getNameInLayout()
);
}
public function getCacheKey()
{
if ($this->hasData('cache_key')) {
return $this->getData('cache_key');
}
/**
* don't prevent recalculation by saving generated cache key
* because of ability to render single block instance with different data
*/
$key = $this->getCacheKeyInfo();
//ksort($key); // ignore order
$key = array_values($key); // ignore array keys
$key = implode('|', $key);
$key = sha1($key);
return $key;
}
在自定义块中自定义缓存键的最佳方式是覆盖getCacheKeyInfo()方法,并根据需要添加唯一标识缓存块所需的数据。
例如,为了根据客户组缓存不同版本的块,您可以执行以下操作:
public function getCacheKeyInfo()
{
$info = parent::getCacheKeyInfo();
$info[] = Mage::getSingleton('customer/session')->getCustomerGroupId()
return $info;
}
cache_tags 是一个启用缓存分段的数组。您只能删除与一个或多个标签匹配的缓存部分。
在 System > Cache Management 下的管理界面中,您可以看到几个可用的默认缓存标记(例如 BLOCK_HTML、CONFIG、...)。您也可以使用自定义缓存标签,只需指定它们即可。
这是Zend_Cache 实现的一部分,与cache_lifetime 和cache_key 相比,需要定制的频率要低得多。
其他缓存
除了块 Magento 缓存了许多其他的东西(收集数据,配置,...)。
您可以使用Mage::app()->saveCache()、Mage::app()->loadCache()、Mage::app()->cleanCache() 和Mage::app()->removeCache() 缓存您自己的数据。有关这些方法的详细信息,请查看Mage_Core_Model_App,它们相当简单。
您还需要使用整页缓存模块。如果您使用的是 Magento EE,那么您已经拥有一个。否则搜索 Magento Connect - 有很多选项(商业)。
除了整页缓存方面,其中一些模块还为您调整 Magento 的各个部分,例如Nitrogento(商业)。
使用像Varnish 这样的反向代理也是非常有益的。
有很多关于这个主题的博客文章。这是 Nitrogento 扩展的出版商的one post。
如果您在更小规模的环境中运行 Magento,请查看我在 magebase.com 上the optimization of the file cache backend 上的帖子。