我正在查看magento网站的性能(服务器加载时间),我正在尝试调整搜索结果页面。我意识到,当我禁用顶级导航,lev分层导航和产品列表等所有重要的东西时,我清除了所有缓存,然后在此magento核心之后再次像60个SQL查询一样重新建立数据库。有没有人有任何程序如何摆脱它们或如何将它们减少到可接受的数量?
我还能以某种方式减少创建积木所花费的时间吗?
非常感谢, 哈罗。
答案 0 :(得分:28)
Magento是一个非常灵活的电子商务框架,但这种灵活性需要付出代价:性能。这个答案是一系列指针和一些关于缓存的细节(特别是对于块)。
要考虑的一件事是Magento环境,例如:调整php,Web服务器(支持Apache上的nginx)和MySQL。另外,为Magento建立一个良好的缓存后端。所有这些都包括在内在Magento Performance Whitepaper中也适用于CE。
环境设置完毕后,事情的另一面就是代码 通过启用平面表目录(系统>配置>目录>前端),可以减少某些页面的查询数量,但您将始终拥有大量查询。
除了调整环境(APC,内存,CPU)之外,您也无法真正减少创建块所花费的时间。正如其他评论者所说,您最好的选择是利用Magento内置的缓存功能。
因为您在问题中特别提到了块,所以我将详细介绍块缓存。块缓存由三个属性控制:
所有这些属性都可以使用setData()或魔术设置器在块的_construct()
方法中设置,或者通过实现相关的getter方法(getCacheLifetime()
,getCacheKey()
,{{ 1}})。
cache_lifetime 以(整数)秒指定。如果将其设置为getCacheTags()
(布尔值),则块将永久缓存(无到期)。如果设置为false
,则不会缓存该块(这是null
中的默认值)。
cache_key 是唯一字符串,用于标识缓存池中的缓存记录。默认情况下,它是由方法Mage_Core_Block_Abstract
返回的数组构造的。
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()
cache_tags 是一个启用缓存分段的数组。您可以删除仅与一个或多个标签匹配的缓存部分
在 System>下的管理界面中缓存管理您可以看到几个可用的默认缓存标记(例如BLOCK_HTML,CONFIG,...)。您也可以使用自定义缓存标记,只需指定它们即可
这是public function getCacheKeyInfo()
{
$info = parent::getCacheKeyInfo();
$info[] = Mage::getSingleton('customer/session')->getCustomerGroupId()
return $info;
}
实施的一部分,与Zend_Cache
和cache_lifetime
相比,需要定制的频率要低得多。
除了块,Magento还会缓存许多其他内容(集合数据,配置......)
您可以使用cache_key
,Mage::app()->saveCache()
,Mage::app()->loadCache()
和Mage::app()->cleanCache()
缓存自己的数据。请查看Mage::app()->removeCache()
以了解有关这些方法的详细信息,它们非常简单。
您还需要使用整页缓存模块。如果您使用的是Magento EE,那么您已经拥有了它。否则搜索Magento Connect - 有很多选项(商业) 其中一些模块还可以在整页缓存方面为您调整Magento的各个部分,例如: Nitrogento(商业)。
使用像Varnish这样的反向代理也非常有用。
关于这个主题有很多博客文章。以下是Nitrogento扩展发布者的one post 如果您在更低规模的环境中运行Magento,请在magebase.com上的the optimization of the file cache backend查看我的帖子。
答案 1 :(得分:11)
这个帖子很旧但很有用。 我正在为速度添加其他评论:
答案 2 :(得分:3)
正如Vinai所说,Magento完全是关于可扩展性的,原始性能是次要的,但可以通过索引和缓存等方法来解决。在没有缓存的情况下显着提高性能将非常困难。缺少整页缓存,启用块缓存是提高性能的好方法,但正确的缓存失效是关键。许多块都是可缓存的,但尚未配置为默认缓存,因此使用分析使用Vinai的指南识别最慢的块以启用缓存。以下是块缓存需要注意的一些事项:
'catalog_product_'.$productId
。同样,对类别使用'catalog_category_'.$categoryId
。这将确保在保存产品或类别(在后端中编辑)时缓存无效。不要在构造函数中设置它们,将它们设置为重写的getCacheTags()
,以便它们仅在保存块时收集,而不是从缓存加载时收集(因为这会破坏缓存的目的)。 Mage::app()->getRequest()->isSecure()
,否则您最终会在https页面上显示http网址,反之亦然。< / LI>
答案 3 :(得分:2)
从Mark开始...... Magento数据库中的大多数表都是InnoDB。虽然查询缓存可以在几个特定的地方使用,但以下更直接相关...
innodb_buffer_pool_size
innodb_thread_concurrency
innodb_flush_method
innodb_flush_log_at_trx_commit
我也用
innodb_file_per_table
因为这可能有助于重组特定的表格。
如果您为数据库提供足够的资源(在合理范围内),流量实际上根本不会加载服务器,因为大多数查询无论如何都是重复的,并且是从数据库缓存中提供的。
换句话说,你可能不用担心......
答案 4 :(得分:1)
确保已打开mysql查询缓存。并在mysql中设置这些变量(可能需要调整,具体取决于您的设置)。
query_cache_type=1
query_cache_size=64M
答案 5 :(得分:1)
我发现了一篇关于Magento性能优化的非常有趣的博客文章,你的服务器和magento商店有很多配置设置对我很有帮助。
http://www.mgt-commerce.com/blog/magento-on-steroids-best-practice-for-highest-performance/
答案 6 :(得分:0)
首先,您需要审核并优化第一个字节的时间(TTFB)。
Magento内置了分析器,可帮助您识别未经优化的代码块。
检查模板文件并确保不要在循环内加载产品模型(常见的性能损失):
foreach($collection as $_product){
$_product = Mage::getModel('catalog/product')->load($_product->getId()
我经常在product / list.phtml
中看到这段代码 上写了一篇循序渐进的文章免责声明:链接指向我自己的网站