调整magento的性能

Jar*_*aro 14 performance magento

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

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

非常感谢,Jaro.

Vin*_*nai 28

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

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

在设置环境之后,事物的另一面就是代码.
通过启用平面表目录(系统>配置>目录>前端),可以减少某些页面的查询数量,但始终会有大量查询.

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

Magento Block Caching

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

  1. cache_lifetime
  2. cache_key
  3. cache_tags

所有这些特性可在设置_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;
}
Run Code Online (Sandbox Code Playgroud)

在自定义块中自定义缓存键的最佳方法是覆盖该getCacheKeyInfo()方法,并根据需要添加唯一标识缓存块所需的数据.

例如,为了根据客户群缓存不同版本的块,您可以执行以下操作:

public function getCacheKeyInfo()
{
    $info = parent::getCacheKeyInfo();
    $info[] = Mage::getSingleton('customer/session')->getCustomerGroupId()
    return $info;
}
Run Code Online (Sandbox Code Playgroud)

所述cache_tags是一个阵列,使高速缓冲存储器分割.您可以删除仅匹配一个或多个标记的缓存部分.
系统>缓存管理下的管理界面中,您可以看到几个可用的默认缓存标记(例如BLOCK_HTML,CONFIG,...).您也可以使用自定义缓存标记,只需指定它们即可.
这是部分Zend_Cache实现,并且需要比远不如经常定制cache_lifetimecache_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扩展的出版商的一篇文章.
如果您在更低规模的环境中运行Magento,请查看我在magebase.com 上优化文件缓存后端的帖子.


Osc*_*als 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. 使用一些Web测试工具来分析负责下载时间的请求数量和其他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-> save调用将保存特定属性的函数.
  52. 在具有部分索引的EE版本中,触发修改触发器以避免多个条目to_cl表.
  53. No.phtml文件绕过块并直接使用模块或资源.因为这将导致没有缓存,这反过来意味着更多Magento的工作.
  54. 根据使用的设备提供图像.
  55. 一些FPC推荐用于社区:Lesti(免费发布日期),Amasty(商业),扩展(商业)和Bolt(商业).
  56. 变暖缓存.
  57. 在高峰时段通过.htaccess控制机器人.
  58. 通过cron每天执行的自定义脚本在分层导航的自定义表中预填充值.
  59. 确保避免不必要的密钥以减少缓存大小.
  60. 使用更高版本的PHP版本5.4+
  61. 使用更高的Mysql版本(5.5 +)
  62. 减少Dom元素的数量.
  63. 从html页面移出所有js.
  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 -性能-提示换scalability.html