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 的性能,這應該有望轉化為更多的轉換。