本文概述
- 检查第三方模块并查找瓶颈
- Magento全页缓存
- 使用Varnish进行全页缓存
- 确保全页缓存有效:它很容易损坏
- 不要忘记启用生产模式
- CSS / JS缩小
- 启用平面表
- 选择快速Magento托管
- Magento图像优化
- 将索引器设置为” 按计划更新”
- GZIP压缩
- 在目录页面和搜索上使用Elasticsearch
- 检查不必要的Ajax呼叫
- Redis用于页面缓存和会话存储
- Magento性能优化总结
在本文中, 我将介绍Magento开发人员可以优化其Magento 2安装的一些方法, 并说明如何执行以下操作:
- 检查第三方模块并查找瓶颈
- 启用全页缓存
- 清漆, 不是用于全页缓存的文件
- 确保全页缓存有效, 可以很容易地将其破坏
- 启用生产模式
- CSS / JS缩小
- 启用平面表
- 获得你负担得起的最快托管
- 优化图像
- 索引器” 按计划更新”
- GZIP压缩
- 在目录页面上使用Elasticsearch并进行搜索。
- 页面加载后检查是否有不必要的Ajax回调返回服务器(可能导致会话锁定)
- Redis用于页面缓存和会话存储
初级开发人员在Magento中做错的主要事情之一是在循环内加载模型。尽量避免这种情况。使用所需的所有内容加载整个集合, 然后遍历整个集合。始终牢记时间和空间的复杂性, 并以优化的方式构建算法。
文章图片
查看布局的加载方式以及执行速度最慢的模板块, 然后查看该代码。查看Model CRUD指标, 你可以在其中找到有见地的数据, 例如将调用载入循环。
Magento全页缓存 当用户访问你的商店时, 将向服务器发出请求。 PHP通过执行特定操作和数据库查询来处理此请求, 然后将相应的HTML返回给用户显示。全页缓存存储该HTML响应, 以便下一个相同的请求将跳过所有后端处理和数据库查询, 直接将其返回。这使网站响应速度更快。
在Magento优化工作中使用全页缓存可以极大地提高你的网站速度。这将创建页面的缓存版本, 并将其交付给用户, 而不是针对每个请求运行所有查询。当然, 并非所有页面都被缓存。例如, 购物车页面将不会被缓存, 否则, 所有用户都将看到页面的第一个缓存版本。这些是特定于用户和会话的动态页面或页面部分。
要启用Magento全页缓存, 你可以运行以下CLI命令:
php bin / magento缓存:启用完整页面
要启用缓存类型, 可以运行CLI命令:
php bin / magento缓存:启用
你还可以通过以管理员身份登录从Magento Admin中进行操作:
- 转到系统> 工具> 缓存管理
- 选择要激活的缓存类型
- 在” 操作” 下拉列表中, 选择” 启用” , 然后单击” 提交” 。
文章图片
使用Varnish进行全页缓存 启用全页缓存时, 请使用Varnish而不是文件来处理。 Magento强烈建议在生产中使用Varnish(或Redis)。集成的全页缓存(到文件系统或数据库)比Varnish慢得多, 并且Varnish旨在加速HTTP通信。
你可以在Magento 2官方文档中找到有关如何安装和配置Varnish的完整指南。
要将Magento配置为使用Varnish以管理员身份登录到Magento管理员, 请执行以下操作:
- 转到商店> 配置> 高级> 系统> 全页缓存
- 在” 缓存应用程序” 列表中, 单击” 上光缓存”
- 在” 公共内容的TTL” 字段中输入一个值
- 展开Varnish Configuration, 然后输入有关你的Varnish配置的特定信息
文章图片
确保全页缓存有效:它很容易损坏 在Magento 2中很容易破坏全页缓存。例如, 如果要从缓存中排除某个块, 则在声明块时不要在XML布局中使用属性cacheable =” false” 。这将禁用包含该块的整个页面的缓存, 而不仅仅是禁用该块。这是我见过的人犯的一个错误。
在布局中查找cacheable =” false” 属性, 并查看在哪些块上设置了这些块, 以及在哪些页面上调用了这些块。因此, 你可以确定琐碎的页面是否存在缓存问题。
你还可以测试是否手动缓存页面。将商店置于开发人员模式下的本地或舞台环境中:
- 清除Magento缓存
- 在浏览器中加载页面
- 在浏览器的调试网络标签中检查页面标题。
- 寻找X-Magento-Cache-Debug:MISS
- 刷新页面, 应将其更改为HIT
不要忘记启用生产模式 Magento具有三种运行模式, 默认, 开发人员和生产模式。
生产模式旨在部署在生产系统上。此模式隐藏异常, 仅从缓存中提供静态文件, 并且不允许你在Magento Admin中启用或禁用缓存类型。它还会阻止自动代码文件编译。
在工作和开发商店时, 开发人员模式处于活动状态。将网站部署到实时服务器时, 请不要忘记切换到生产模式!
用于查看当前模式的CLI命令是:
php bin / magento deploy:模式:显示
切换到生产模式的CLI命令是:
php bin / magento deploy:mode:set生产
切换到开发人员模式的CLI命令是:
php bin / magento deploy:mode:set开发人员
你可以在此处找到有关不同Magento模式的更多详细信息。
CSS / JS缩小 缩小CSS和JS文件是Magento 2速度优化的重要元素。通过缩小它们, 我们删除了文件中的所有空格, 制表符和换行符。生成的文件将具有较少的字符, 因此具有较小的大小, 因此下载速度更快。
Magento内置了此功能, 你可以在Admin中启用CSS / JS缩小功能。要启用JavaScript压缩, 请按照以下步骤操作:
- 将Magento置于生产模式
- 转到商店> 配置> 高级> 开发人员
- 将” 缩小Javascript文件” 选项设置为” 是”
- 保存配置
- 在系统> 缓存管理页面上刷新缓存
文章图片
要启用CSS缩小, 需要执行以下步骤:
- 将Magento置于生产模式
- 转到商店> 配置> 高级> 开发人员> CSS设置
- 将” 缩小CSS文件” 选项设置为” 是”
- 保存配置
- 在系统> 缓存管理页面上刷新缓存
文章图片
注意:请勿合并JS文件-请将它们缩小。
启用平面表 Magento使用EAV(实体属性值)模型, 该模型根据其值类型在多个表中存储其实体的属性。使用多个表, 必须对多个表进行联接和请求才能检索数据, 这会降低查询速度。
Magento可以选择将平面表用于目录和产品。通过将实体的所有属性合并到一个表中来创建平面表。当请求数据时, 我们需要查询一张表, 使其更快。
Magento在每个索引上生成并更新平面表。你可以通过以管理员身份登录Magento Admin来启用平面表:
- 转到商店> 配置> 目录> 目录> 店面
- 选择” 是” 以使用平面目录类别
- 选择” 是” 以使用平面目录产品
- 保存配置
文章图片
选择快速Magento托管 查看Magento的最低要求, 看看你的服务器是否符合要求。你可以在此处查看官方的Magento 2.2.x技术堆栈要求。
托管配置对于Magento 2的性能非常重要。 Magento也有专用的托管服务, 尽管这些服务最重要的是市场营销。
底线:获得负担得起的最快的托管解决方案, 除非它对你的项目而言过于苛刻。
Magento图像优化 图片的大小显然会影响网站的速度。例如, 如果你的目录页面包含20种产品, 而每个产品图片的大小均为1Mb, 则在页面加载时总共要下载20Mb, 这在某些情况下显然是个问题(移动设备, 某些地区的带宽有限等)。
检查图像是否经过适当优化, 并且它们在质量和尺寸之间是否具有良好的比率。另外, 请确保你的图片未通过CSS调整大小, 但已将源文件调整为所需的特定大小。
另一种技术是使用延迟加载, 这意味着在页面完全加载后或用户滚动浏览目录时加载图像。
你还可以使用AWS或CDN更快地交付内容。让我们从位图优化的角度快速看一下AWS, CDN和传统托管之间的区别。
传统托管
传统方式是将内容(例如图像)存储在与网站相同的服务器上。这会占用磁盘空间和很大一部分带宽, 从而造成大量服务器负载。显然, 使用传统托管进行扩展可能是一个问题。
CDN(内容交付网络)
内容分发网络通常用于通过服务网站的某些内容来减轻服务器的负载。除此之外, 它还可以通过快速交付你的内容来带来高性能, 并可以通过使用多个网络来提供高可用性。
AWS(Amazon CloudFront)
Amazon CloudFront是一个高度安全的内容交付网络(CDN), 可提供网络和应用程序级别的保护。查看本教程, 了解如何开始使用AWS并更快地交付内容。
此外, 你可以使用AWS根据通过查询参数传递的尺寸动态调整图像大小。有关更多信息, 请参阅有关使用Amazon CloudFront和[电子邮件保护]调整图像大小的教程。
将索引器设置为” 按计划更新” 【Magento性能优化说明】Magento索引器可以设置为两种模式:” 按保存更新” 或” 按计划更新” 。
每次保存产品, 属性或类别时, 将它们设置为” 保存时更新” 时, 特定索引开始运行。索引器可能会占用资源, 并且可能会使服务器速度变慢。
设置索引器的最佳模式是” 按计划更新” 。这样, 你可以确保它们由cron作业在你设置的特定时间执行。选择网站流量较低的时间。
你可以通过运行以下命令来查看当前的索引器模式:
php bin / magento索引器:显示模式
或在Magento Admin中通过以下操作:
系统> 索引管理
你可以通过运行以下命令将索引器模式更改为” 按计划更新” :
php bin / magento索引器:设置模式时间表
你可以通过运行以下命令将索引器模式更改为” 保存时更新” :
php bin / magento索引器:设置模式实时
这是在Magento Admin中:
系统> 索引管理:选择所有索引器, 然后从” 操作” 下拉列表中选择” 按计划更新”
文章图片
你还可以通过进入管理员来配置计划任务:
商店> 设置> 配置> 高级> 系统> Cron(计划任务)
展开” 组的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管理员:
- 单击商店> 设置> 配置> 目录> 目录> 目录搜索。
- 从搜索引擎列表中, 单击Elasticsearch或Elasticsearch 5.0+, 如下图所示。 (Elasticsearch 5.0+选项不适用于Magento 2.1。)
文章图片
检查不必要的Ajax呼叫 页面加载后回调到服务器可能会导致会话锁定。一种检查页面正在执行的所有Ajax调用的方法是使用Chrome中的DevTools。你可以通过右键单击页面并选择检查来打开它。
转到网络选项卡, 你可以在此处按XHR过滤请求。现在, 你可以查看页面上的所有Ajax请求, 并检查它们以查看特定页面上哪些是必需的。
文章图片
Redis用于页面缓存和会话存储 Redis是一个可选的后端缓存解决方案, 用于替换默认在Magento 2中使用的Zend_Cache_Backend_File。
为什么要使用Redis?
使用Redis具有多个优点:
- 你可以将Memcached替换为Redis, 因为它也可以用于PHP会话存储。
- Redis支持磁盘保存和主/从复制, 这是memcached不支持的一项高度要求的功能。复制避免了单点故障, 并提供了高可用性。
- 标记操作不需要对每个缓存文件进行全面扫描, 因为Redis通过索引文件中的标记来工作。
- 后端支持基于标记的缓存清理, 而无需foreach循环。
- 由于Redis是内存存储, 因此所有数据都必须容纳在内存中, 这意味着它仅受RAM速度和容量的限制。
以下是添加到< 你的Magento安装目录> 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安装目录> app / etc / env.php文件, 也可以使用命令行, 这是推荐的方法, 因为它还提供了验证。
对于默认缓存, 请运行以下命令:
php bin / magento setup:config:set – cache-backend = redis – cache-backend-redis- < 参数名称> = < 参数值> …
指定特定于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进行页面缓存和会话存储, 这比默认的内存缓存要快得多。
你可以实施所有这些建议, 或者仅执行一些到目前为止尚未使用的建议。甚至一对夫妇也足以改善Magento的性能, 希望可以将其转化为更多的转化。
推荐阅读
- JavaScript,Python,Ruby,Swift和Scala中的Option/Maybe,Ether和Future Monad
- 现在该使用Node 8了吗()
- 变更日志(OWASP十大项目)
- 智能Node.js表单验证
- 使用Spring Boot进行OAuth2和JWT REST保护
- 如何创建安全的Node.js GraphQL API
- 使用Laravel构建GraphQL服务器
- 加快生产中故障排除速度的7种调试技术
- 深入浅出(创建Flask项目完整实例步骤)