调整magento的性能

时间:2012-02-09 18:38:27

标签: performance magento

我正在查看magento网站的性能(服务器加载时间),我正在尝试调整搜索结果页面。我意识到,当我禁用顶级导航,lev分层导航和产品列表等所有重要的东西时,我清除了所有缓存,然后在此magento核心之后再次像60个SQL查询一样重新建立数据库。有没有人有任何程序如何摆脱它们或如何将它们减少到可接受的数量?

我还能以某种方式减少创建积木所花费的时间吗?

非常感谢, 哈罗。

7 个答案:

答案 0 :(得分:28)

Magento是一个非常灵活的电子商务框架,但这种灵活性需要付出代价:性能。这个答案是一系列指针和一些关于缓存的细节(特别是对于块)。

要考虑的一件事是Magento环境,例如:调整php,Web服务器(支持Apache上的nginx)和MySQL。另外,为Magento建立一个良好的缓存后端。所有这些都包括在内在Magento Performance Whitepaper中也适用于CE。

环境设置完毕后,事情的另一面就是代码 通过启用平面表目录(系统>配置>目录>前端),可以减少某些页面的查询数量,但您将始终拥有大量查询。

除了调整环境(APC,内存,CPU)之外,您也无法真正减少创建块所花费的时间。正如其他评论者所说,您最好的选择是利用Magento内置的缓存功能。

Magento Block Caching

因为您在问题中特别提到了块,所以我将详细介绍块缓存。块缓存由三个属性控制:

  1. cache_lifetime
  2. cache_key
  3. cache_tags
  4. 所有这些属性都可以使用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_Cachecache_lifetime相比,需要定制的频率要低得多。

    其他缓存

    除了块,Magento还会缓存许多其他内容(集合数据,配置......) 您可以使用cache_keyMage::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)

这个帖子很旧但很有用。 我正在为速度添加其他评论:

  1. 而不是使用Apache使用nginx或litespeed。
  2. 确保使用平面目录。
  3. 如果可能,请使用FPC。
  4. 要设置的编译模式。
  5. 合并css和js(Fooman Speedster)。
  6. 使用图片精灵来减少请求数量。
  7. 使用查询缓存但避免大小超过64 MB。
  8. 通过删除xml来删除所有未使用的模块。只是禁用禁用。
  9. 会议将在Ram。
  10. 建议使用APC。
  11. 你的cron应该在非高峰期运行。
  12. 如果不使用,请删除其他商店。
  13. 如果不使用,请删除购物车规则。
  14. 优化图片大小。
  15. 尽可能使用Ajax。
  16. CMS块比magento块需要更多时间,因此除非您想要修改块,否则不要使用CMS块。
  17. 不要使用集合计数使用集合getSize来获取集合大小。
  18. 最小化可搜索属性的数量,因为这会导致平面目录表中的列,并会降低搜索速度。
  19. 建议使用Solr搜索。它带有EE版本,但它也可以与CE一起安装。
  20. 根据评论中的建议尽量减少客户群。
  21. 在.htaccess中启用压缩(Apache 1.3的mod_gzip,Apache 2的mod_deflate)
  22. 如果在EE上删除暂存商店。
  23. 使用Apache mod_expires并确保设置缓存文件的时间长度。如果您在Apache服务器上。
  24. 使用内容分发网络(CDN)。
  25. 启用Apache KeepAlives。
  26. 使您的输出符合W3C
  27. 建议使用getChildHtml(' childName'),因为这会阻止块直接使用.phtml文件中的块代码。
  28. 确保运行cron以清理存储在数据库中的日志。
  29. 应根据要求最小化日志的天数。
  30. 如果内存允许,则在RAM上加载缓存。
  31. 减少硬盘文件读取并尝试从ram读取,因为这样更快。
  32. 将PHP版本升级到5.3以上
  33. 如果在EE上确保大多数页面都是在没有应用程序初始化的情况下交付的。即使一个容器需要应用程序初始化,它也会影响执行速度,因为单独的表单URL会重写大部分其他代码将被执行。
  34. 检查XML是否存在默认句柄中的块,如果这些块不在特定页面上,则将这些XML值从默认句柄移动到特定句柄。已经观察到执行了大量未显示的块。
  35. 如果使用FPC,请确保缓存容器并通过缓存传递容器的重复请求。错误的占位符定义导致容器缓存未被使用,但每次生成新容器内容时都会生成。
  36. 分析页面块和变量,如果可能,将这些变量/块添加到缓存中。
  37. 关闭用Magento写的日志。
  38. 删除管理员通知模块。
  39. 使用图像精灵。
  40. 使用一些网络测试工具来分析负责下载时间的请求数量和其他与html相关的参数,并采取相应的行动。
  41. 如果不需要,请删除属性。如果不使用,我们甚至可以删除系统属性。 42:如果在企业上确保有效使用部分索引。
  42. 编写自己的solr搜索填充以绕过Magento搜索索引。
  43. 清理_cl表或减少_cl表行。
  44. 我会添加到列表中:尽可能避免文件缓存,将其替换为apc / redis / memcache(由Jaro建议)
  45. 删除未使用的系统属性(小心,在删除之前进行彻底检查)。
  46. 有一些cron标签工作不适用于所有商店,因此根据您的商店功能,可以将其删除。
  47. 通过适当的属性管理进行优化,例如将所需属性设置为是或可在列表中搜索或要求等。
  48. 所有商店都不需要一些观察员,因此如果这些观察员不适用于特定的Magento网站,则应将其删除。
  49. 确保FPC适用于大多数网站页面。特别是当您添加一些新的控制器来传递页面时。
  50. Magento有很多功能。为此它有很多事件和相关的观察者。商店没有使用的功能很少,所以任何与该功能相关的观察者都应该被删除.eg:如果你检查企业版,那么类别权限概念如果不使用,则建议在事件后保存相关观察者的权限被删除。
  51. 如果要为产品保存特定属性,则代替调用$ product->保存调用将保存特定属性的函数。
  52. 在具有部分索引的EE版本中,触发修改触发器以避免多个条目to_cl表。
  53. No.phtml文件绕过块并直接使用模块或资源。因为这将导致没有缓存,这反过来意味着更多的Magento工作。
  54. 根据使用的设备提供图像。
  55. 为社区推荐的一些FPC:Lesti(免费发布日期),Amasty(商业),扩展(商业)和Bolt(商业)。
  56. Warming Cache。
  57. 在高峰时段通过.htaccess控制机器人。
  58. 通过cron每天执行的自定义脚本在分层导航的自定义表格中预填充值。
  59. 确保避免不需要的密钥以减少缓存大小。
  60. 使用更高版本的PHP版本5.4 +
  61. 使用更高的Mysql版本(5.5 +)
  62. 减少Dom元素的数量。
  63. 将所有js从html页面移出。
  64. 删除已评论的HTML。
  65. 如果在企业版(1.13或更高版本)上修改触发器以减少_cl表条目。由于这些条目导致缓存刷新,这反过来导致缓存命中率降低,因此TTFB时间更长。
  66. 使用Magmi进口产品。
  67. 一些重要的链接: - http://www.oscprofessionals.com/blog/understanding-full-page-cache-concept-magento/和 - http://dionbeetson.blogspot.com.au/2014/11/magento-performance-tips-for-scalability.html

答案 2 :(得分:3)

正如Vinai所说,Magento完全是关于可扩展性的,原始性能是次要的,但可以通过索引和缓存等方法来解决。在没有缓存的情况下显着提高性能将非常困难。缺少整页缓存,启用块缓存是提高性能的好方法,但正确的缓存失效是关键。许多块都是可缓存的,但尚未配置为默认缓存,因此使用分析使用Vinai的指南识别最慢的块以启用缓存。以下是块缓存需要注意的一些事项:

  • 列出产品信息的任何块都应包含产品标记'catalog_product_'.$productId。同样,对类别使用'catalog_category_'.$categoryId。这将确保在保存产品或类别(在后端中编辑)时缓存无效。不要在构造函数中设置它们,将它们设置为重写的getCacheTags(),以便它们仅在保存块时收集,而不是从缓存加载时收集(因为这会破坏缓存的目的)。
  • 如果您使用https并且该块可以显示在https页面上并包含静态资源,请确保缓存键包含Mage::app()->getRequest()->isSecure(),否则您最终会在https页面上显示http网址,反之亦然。< / LI>
  • 确保您的缓存后端有足够的容量并避免不必要的缓存刷新。
  • 不要缓存本身缓存的块的子块,除非父级更改频率比子级块更频繁,否则您只是使缓存后端混乱。
  • 如果您正确缓存标记,则应该能够安全地使用非常长的默认缓存生存期。我相信设置“假”,因为生命实际上使用默认值,而不是无限。默认值为7200秒,但可以在local.xml中配置。
  • 在大多数情况下使用redis backend将为您提供最佳和最一致的性能。使用Redis时,您可以使用此munin plugin监视已用内存大小。

答案 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

中看到这段代码

我在how to optimize TTFB

上写了一篇循序渐进的文章

免责声明:链接指向我自己的网站