Magento 性能优化说明

已发表: 2022-03-11

Magento 的性能至关重要。 加载速度对您网站的转换率有直接且可衡量的影响,因此优化 Magento 安装对于您的 Magento 商店乃至整个业务的成功至关重要。

在本文中,我将介绍 Magento 开发人员可以优化其 Magento 2 安装的一些方法,并解释如何执行以下操作:

  • 检查第三方模块,发现瓶颈
  • 启用整页缓存
  • 清漆,而不是整页缓存的文件
  • 确保整页缓存有效,它很容易被破坏
  • 启用生产模式
  • CSS/JS 缩小
  • 启用平面表
  • 获得您负担得起的最快托管服务
  • 优化图像
  • “按计划更新”的索引器
  • GZIP 压缩
  • 在目录页面和搜索上使用 Elasticsearch。
  • 在页面加载后检查对服务器的不必要的 Ajax 调用(可能导致会话锁定)
  • Redis 用于页面缓存和会话存储

检查第三方模块并找到瓶颈

有许多第三方 Magento 模块代码错误,使用不推荐使用的方法,或者与最新稳定版 Magento 存在兼容性问题。 识别繁重请求的最佳方法是使用分析器。 这可以帮助您确定页面上有多少 MySQL 查询以及有多少是相同的。 知道了这一点,您可以将这些查询压缩为一个,从而加快 Magento。

初级开发人员在 Magento 中做错的主要事情之一是在循环中加载模型。 尽量避免这种情况。 用你需要的一切加载整个集合,然后循环遍历它。 始终牢记时间和空间复杂性,并以优化的方式构建您的算法。

Magento 性能图表

查看您的布局是如何加载的,哪些是执行最慢的模板块,然后查看该代码。 查看模型 CRUD 指标,您可以在其中找到有洞察力的数据,例如将调用加载到循环中。

Magento 全页缓存

当用户访问您的商店时,会向服务器发出请求。 该请求由 PHP 处理,执行特定操作和数据库查询,然后返回相应的 HTML 以显示给用户。 全页缓存存储该 HTML 响应,以便下一个相同的请求将直接返回它,跳过所有后端处理和数据库查询。 这使得网站响应速度更快。

在您的 Magento 优化工作中使用整页缓存可以极大地提高您的网站速度。 这将创建页面的缓存版本并将它们交付给用户,而不是为每个请求运行所有查询。 当然,并非所有页面都被缓存。 例如,购物车页面不会被缓存,否则,所有用户都会看到页面的第一个缓存版本。 这些是特定于用户和会话的动态页面或页面部分。

要启用 Magento 整页缓存,您可以运行以下 CLI 命令:

php bin/magento cache:enable full_page

要启用缓存类型,您可以运行 CLI 命令:

php bin/magento cache:enable

您也可以通过以管理员身份登录从 Magento Admin 执行此操作:

  1. 转到系统>工具>缓存管理
  2. 选择要激活的缓存类型
  3. 操作下拉列表中选择启用并单击提交

Magento 性能优化截图

使用 Varnish 进行整页缓存

启用整页缓存时,使用 Varnish 来处理它,而不是文件。 Magento 强烈建议在生产中使用 Varnish(或 Redis)。 集成的整页缓存(到文件系统或数据库)比 Varnish 慢得多,而 Varnish 旨在加速 HTTP 流量。

您可以在 Magento 2 官方文档中找到有关如何安装和配置 Varnish 的完整指南。

要配置 Magento 以使用 Varnish 以管理员身份登录 Magento Admin:

  1. 转到商店>配置>高级>系统>整页缓存
  2. 缓存应用程序列表中,单击清漆缓存
  3. 公共内容的 TTL字段中输入一个值
  4. 展开Varnish 配置并输入有关您的 Varnish 配置的具体信息

Magento 性能优化整页缓存截图

确保整页缓存有效:它很容易被破坏

在 Magento 2 中,整页缓存很容易被破坏。例如,如果你想从缓存中排除一个块,在声明你的块时不要在 XML 布局中使用属性cacheable="false" 。 这将禁用包含该块的整个页面的缓存,而不仅仅是该块。 这是我见过人们犯的错误。

在您的布局中查找cacheable="false"属性并查看它们设置在哪些块上以及在哪些页面上调用了这些块。 因此,您可以确定普通页面是否存在缓存问题。

您还可以测试您的页面是否手动缓存。 在本地或舞台环境中将商店置于开发者模式:

  1. 清除 Magento 缓存
  2. 在浏览器中加载页面
  3. 检查浏览器调试网络选项卡中的页眉。
  4. 寻找 X-Magento-Cache-Debug: MISS
  5. 刷新页面,它应该变为 HIT

如果它没有更改为 HIT,则表示该页面未缓存并且缓存不起作用。

不要忘记启用生产模式

Magento 有三种运行模式,默认开发者生产模式。

生产模式旨在部署在生产系统上。 此模式隐藏异常,仅从缓存中提供静态文件,并且不允许您在 Magento Admin 中启用或禁用缓存类型。 它还可以防止自动代码文件编译。

在开发商店时,开发者模式处于活动状态。 将站点部署到实时服务器时,不要忘记切换到生产模式!

查看当前模式的 CLI 命令是:

php bin/magento deploy:mode:show

切换到生产模式的 CLI 命令是:

php bin/magento deploy:mode:set production

切换到开发者模式的 CLI 命令是:

php bin/magento deploy:mode:set developer

您可以在此处找到有关不同 Magento 模式的更多详细信息。

CSS/JS 缩小

缩小 CSS 和 JS 文件是 Magento 2 速度优化的重要元素。 通过缩小它们,我们删除了文件中的所有空格、制表符和换行符。 生成的文件将具有更少的字符,因此尺寸更小,因此下载速度更快。

Magento 内置了此功能,您可以在 Admin 中启用 CSS/JS 缩小。 要启用 JavaScript 缩小,请执行以下步骤:

  1. 将 Magento 置于生产模式
  2. 转到商店>配置>高级>开发人员
  3. Minify Javascript Files选项设置为Yes
  4. 保存配置
  5. 系统>缓存管理页面刷新缓存

Magento 生产模式截图

要启用 CSS 缩小,需要执行以下步骤:

  1. 将 Magento 置于生产模式
  2. 转到商店>配置>高级>开发人员> CSS 设置
  3. 缩小 CSS 文件选项设置为
  4. 保存配置
  5. 系统>缓存管理页面刷新缓存

Magento CSS 缩小截图

注意:不要合并 JS 文件——只需将它们缩小

启用平面表

Magento 使用 EAV(实体属性值)模型,该模型根据其值类型将其实体的属性存储在多个表中。 在多个表上使用多个表、连接和请求是检索数据所必需的,这会减慢查询速度。

Magento 可以选择为目录和产品使用平面表格。 平面表是通过将实体的所有属性合并到一个表中来创建的。 当请求数据时,我们需要查询一张表,使其更快。

Magento 在每个索引上生成和更新平面表。 您可以通过以管理员身份登录 Magento Admin 来启用平面表:

  1. 转到商店>配置>目录>目录>店面
  2. 使用平面目录类别选择
  3. 选择是以使用平面目录产品
  4. 保存配置

Magento 平板电脑屏幕截图

选择快速 Magento 托管

查看 Magento 的最低要求,看看您的服务器是否满足这些要求。 您可以在此处查看官方 Magento 2.2.x 技术堆栈要求。

托管配置对于 Magento 2 的性能非常重要。 Magento 也有专门的托管服务,尽管这些服务更多地是关于营销的。

底线:获得您能负担得起的最快的托管解决方案,除非它对您的项目来说太过分了。

Magento 图像优化

图片的大小显然会影响网站的速度。 例如,如果您有一个包含 20 个产品的目录页面,并且每个产品图像的大小为 1Mb,那么在页面加载时总共需要下载 20Mb,这在某些情况下显然是一个问题(移动设备、某些地区的带宽有限等)。

检查您的图像是否经过适当优化,以及它们的质量和尺寸之间的比例是否合适。 此外,请确保您的图像没有通过 CSS 调整大小,而是将源文件调整为您需要的特定大小。

另一种技术是使用延迟加载,这意味着在页面完全加载后加载图像,或者在用户滚动目录时加载。

您还可以使用 AWS 或 CDN 更快地交付您的内容。 让我们从位图优化的角度快速看一下 AWS、CDN 和传统托管之间的区别。

传统托管

传统方式是将您的内容(例如图像)存储在与您的网站相同的服务器上。 这会占用磁盘空间和很大一部分带宽,从而造成大量服务器负载。 显然,使用传统托管进行扩展可能是一个问题。

CDN(内容交付网络)

内容交付网络通常用于通过为网站的某些内容提供服务来减少服务器的负载。 除此之外,它还通过使用多个网络调用来快速交付您的内容和高可用性,从而带来高性能。

AWS (亚马逊云前)

Amazon CloudFront 是一个高度安全的内容分发网络 (CDN),可提供网络和应用程序级别的保护。 查看本教程,了解如何开始使用 AWS 并更快地交付内容。

此外,您可以使用 AWS 根据通过查询参数传递的尺寸动态调整图像大小。 有关更多信息,请参阅有关使用 Amazon CloudFront 和 Lambda@Edge 调整图像大小的教程。

将索引器设置为“按计划更新”

Magento 索引器可以设置为两种模式:“保存时更新”或“按计划更新”。

当您每次保存产品、属性或类别时将它们设置为“保存时更新”时,特定索引开始运行。 索引器可能会消耗资源,这可能会降低您的服务器速度。

设置索引器的最佳模式是“按计划更新”。 通过这种方式,您可以确定它们是由 cron 作业在您设置的特定时间执行的。 选择您网站上的流量较低的时间。

您可以通过运行以下命令查看当前的索引器模式:

php bin/magento indexer:show-mode

或者在 Magento Admin 中访问:

系统>索引管理

您可以通过运行以下命令将索引器模式更改为“按计划更新”:

php bin/magento indexer:set-mode schedule

您可以通过运行以下命令将索引器模式更改为“保存时更新”:

php bin/magento indexer:set-mode realtime

它在 Magento Admin 中:

系统>索引管理:选择所有索引器并从操作下拉列表中选择“按计划更新”

图片替代文字

您还可以通过进入 Admin 来配置计划任务:

商店>设置>配置>高级>系统> Cron(计划任务)

展开“组的 Cron 配置选项:索引”

Magento cron 配置对话框

GZIP 压缩

Gzip 是一种压缩文件以加快网络传输的方法。 压缩允许您的 Web 服务器提供更小的文件大小,从而为您的网站用户加载更快。 然而,这是有代价的。

压缩文件时会加载 CPU,压缩文件越多,所需的过程就越长。 尽管这会增加服务器 CPU 负载,但也可能会大大降低带宽使用率。 使用 gzip,您可以选择不同的压缩级别,范围从 1 到 9。

在级别 1 上,您拥有最快的压缩时间,但压缩率较低。 另一方面,在第 9 级,您的压缩率最高,但速度较低。 gzip 的默认配置使用 6 级,有利于压缩而不是速度。 Nginx 虽然使用 1 级,但有利于速度而不是文件大小。

要打开 gzip 压缩并激活 Apache 的mod_deflate模块,您可以通过更新 .htaccess 文件并取消注释相应的行来添加它,如下所示。 mod_deflate模块在将静态资源传输到浏览器之前将它们压缩成更小的文件。

 <IfModule mod_deflate.c> ############################################ ## enable apache served files compression ## http://developer.yahoo.com/performance/rules.html#gzip # Insert filter on all content SetOutputFilter DEFLATE # Insert filter on selected content types only AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/x-javascript application/json image/svg+xml # Netscape 4.x has some problems... BrowserMatch ^Mozilla/4 gzip-only-text/html # Netscape 4.06-4.08 have some more problems BrowserMatch ^Mozilla/4\.0[678] no-gzip # MSIE masquerades as Netscape, but it is fine BrowserMatch \bMSIE !no-gzip !gzip-only-text/html # Don't compress images SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary # Make sure proxies don't deliver the wrong content Header append Vary User-Agent env=!dont-vary </IfModule>

在目录页面和搜索上使用 Elasticsearch

提高网站速度的另一种方法是将 Elasticsearch 用于目录页面和搜索结果。 设置您的 Elasticsearch 服务器并将您的 Magento 存储连接到它。 使用 Elasticsearch 搜索变得更快。

本官方指南解释了如何使用 Elasticsearch 配置 Magento。

要将 Magento 配置为使用 Elasticsearch,请以管理员身份登录 Magento Admin:

  1. 单击商店>设置>配置>目录>目录>目录搜索
  2. Search Engine列表中,单击ElasticsearchElasticsearch 5.0+ ,如下图所示。 ( Elasticsearch 5.0+选项不适用于 Magento 2.1。)

在 Magento 中设置 Elasticsearch

检查不必要的 Ajax 调用

页面加载后回调服务器可能会导致会话锁定。 检查页面正在执行的所有 Ajax 调用的一种方法是使用 Chrome 中的 DevTools。 您可以通过右键单击页面并选择检查来打开它。

转到网络选项卡,您可以在那里按 XHR 过滤请求。 现在您可以查看页面的所有 Ajax 请求并检查它们以查看在该特定页面上哪些是必需的。

Magento 中的 Ajax 调用

Redis 用于页面缓存和会话存储

Redis 是一个可选的后端缓存解决方案,用于替代 Magento 2 默认使用的Zend_Cache_Backend_File

为什么要使用 Redis?

使用 Redis 可以有多个优点:

  • 您可以用 Redis 替换 memcached,因为它也可以用于 PHP 会话存储。
  • Redis 支持磁盘上保存和主/从复制,这是 memcached 不支持的高要求功能。 复制可避免单点故障并提供高可用性。
  • 标签操作不需要对每个缓存文件进行全面扫描,因为 Redis 通过索引文件中的标签来工作。
  • 后端支持基于标签的缓存清理,无需 foreach 循环。

还有一个主要缺点:

  • 因为 Redis 是内存存储,所以您的所有数据都必须适合内存,这意味着它仅受 RAM 速度和容量的限制。

配置 Magento 以使用 Redis 进行会话存储

以下是添加到<your Magento install dir>app/etc/env.php的示例配置:

 'session' => array ( 'save' => 'redis', 'redis' => array ( 'host' => '127.0.0.1', 'port' => '6379', 'password' => '', 'timeout' => '2.5', 'persistent_identifier' => '', 'database' => '2', 'compression_threshold' => '2048', 'compression_library' => 'gzip', 'log_level' => '1', 'max_concurrency' => '6', 'break_after_frontend' => '5', 'break_after_adminhtml' => '30', 'first_lifetime' => '600', 'bot_first_lifetime' => '60', 'bot_lifetime' => '7200', 'disable_locking' => '0', 'min_lifetime' => '60', 'max_lifetime' => '2592000' ) ),

您可以在此处查看有关参数的所有详细信息,以及如何对您的 Redis 安装与 Magento 一起正常工作进行基本验证。

配置 Magento 以使用 Redis 作为页面和默认缓存

有两种方法可以为 Redis 配置页面和默认缓存。 您可以手动编辑<Magento install dir>app/etc/env.php文件,也可以使用命令行,这是推荐的方法,因为它也提供验证。

对于默认缓存运行命令:

php bin/magento setup:config:set --cache-backend=redis --cache-backend-redis-<parameter_name>=<parameter_value>...

指定特定于 Redis 默认缓存的参数。

对于页面缓存运行命令:

Php bin/magento setup:config:set --page-cache=redis --page-cache-redis-server=redis.example.com --page-cache-redis-db=1

此命令启用 Redis 页面缓存,将主机设置为redis.example.com并将数据库编号分配为 1。您可以查看 Magento DevDocs 上的所有详细信息。

Magento 性能优化总结

我们已经介绍了很多 Magento 2 性能优化的方法,所以让我们快速回顾一下。

识别和解决瓶颈将对处理数据产生巨大影响。 使用整页缓存和 Varnish 还可以提高您的网站速度并加速 HTTP 流量。 您应该始终在实时服务器上的生产模式下使用 Magento,没有任何借口。 使用缩小来减小 CSS 和 JS 文件的大小,较小的文件下载速度更快,占用的带宽也更少。

启用平面表以减少数据库请求并提高数据库响应时间。 优化您的图像并尽可能使用 CDN。 将索引器设置为按时更新并启用 Magento cron。 启用 gzip 压缩也会减小要下载的文件的大小。 使用 Elasticsearch 将提高目录页面的速度,并且搜索结果页面的加载速度会更快。 使用 Redis 进行页面缓存和会话存储,这比默认的 memcache 快得多。

您可以实施所有这些建议,也可以只实施一些迄今为止尚未使用的建议。 即使是一对也足以提高 Magento 的性能,这应该有望转化为更多的转换。