Wyjaśnienie optymalizacji wydajności Magento

Opublikowany: 2022-03-11

Wydajność Magento ma ogromne znaczenie. Szybkość ładowania ma bezpośredni i wymierny wpływ na współczynnik konwersji Twojej witryny, dlatego zoptymalizowana instalacja Magento ma kluczowe znaczenie dla sukcesu Twojego sklepu Magento, a być może nawet Twojej firmy w ogóle.

W tym artykule przedstawię kilka sposobów, w jakie programiści Magento mogą zoptymalizować swoją instalację Magento 2 i wyjaśnię, jak wykonać następujące czynności:

  • Sprawdź moduły innych firm i znajdź wąskie gardła
  • Włącz pamięć podręczną całej strony
  • Lakier, a nie pliki do całostronicowej pamięci podręcznej
  • Upewnij się, że pamięć podręczna na całą stronę działa, można ją tak łatwo zepsuć
  • Włącz tryb produkcyjny
  • Minifikacja CSS/JS
  • Włącz płaskie tabele
  • Uzyskaj najszybszy hosting, na jaki Cię stać
  • Optymalizuj obrazy
  • Indeksatory do „Aktualizacji zgodnie z harmonogramem”
  • Kompresja GZIP
  • Korzystaj z Elasticsearch na stronach katalogu i wyszukiwania.
  • Sprawdź, czy nie ma niepotrzebnych wywołań Ajax z powrotem do serwera po załadowaniu strony (może powodować blokady sesji)
  • Redis dla pamięci podręcznej strony i przechowywania sesji

Sprawdź moduły innych firm i znajdź wąskie gardła

Istnieje wiele modułów Magento innych firm ze złym kodem, używających przestarzałych metod lub mających problemy ze zgodnością z najnowszą stabilną wersją Magento. Najlepszym sposobem identyfikacji ciężkich żądań jest użycie profilera. Pomaga to określić, ile zapytań MySQL masz na stronie i ile jest identycznych. Wiedząc o tym, możesz skondensować te zapytania w jedno, a tym samym przyspieszyć Magento.

Jedną z głównych rzeczy, które młodzi programiści robią źle w Magento, jest ładowanie modeli wewnątrz pętli. Staraj się tego unikać, jak tylko możesz. Załaduj całą kolekcję wszystkim, czego potrzebujesz, a następnie przejrzyj ją. Zawsze pamiętaj o złożoności czasowej i przestrzennej i buduj swój algorytm w zoptymalizowany sposób.

Wykres wydajności Magento

Zobacz, jak ładowany jest układ i które bloki szablonów działają najwolniej, a następnie zajrzyj do tego kodu. Przyjrzyj się metrykom Model CRUD, w których możesz znaleźć wnikliwe dane, takie jak wywołania ładowania w pętlach.

Całostronicowa pamięć podręczna Magento

Gdy użytkownik uzyskuje dostęp do Twojego sklepu, do serwera wysyłane jest żądanie. To żądanie jest przetwarzane przez PHP wykonującego określone operacje i zapytania do bazy danych, a następnie zwracającego odpowiedni kod HTML, który ma zostać wyświetlony użytkownikowi. Całostronicowa pamięć podręczna przechowuje tę odpowiedź HTML, dzięki czemu następne identyczne żądanie bezpośrednio ją zwróci, pomijając wszystkie zapytania dotyczące przetwarzania i bazy danych w zapleczu. Dzięki temu reakcja strony internetowej jest znacznie szybsza.

Korzystanie z pamięci podręcznej całej strony w ramach optymalizacji Magento może znacznie zwiększyć szybkość witryny. Spowoduje to utworzenie buforowanych wersji stron i dostarczenie ich użytkownikowi zamiast uruchamiania wszystkich zapytań dla każdego żądania. Oczywiście nie wszystkie strony są buforowane. Na przykład strona koszyka nie będzie buforowana, w przeciwnym razie wszyscy użytkownicy zobaczą pierwszą wersję strony z pamięci podręcznej. Są to dynamiczne strony lub sekcje stron, które są specyficzne dla użytkownika i sesji.

Aby włączyć pełnostronicową pamięć podręczną Magento, możesz uruchomić następujące polecenie CLI:

php bin/magento cache:enable full_page

Aby włączyć typy pamięci podręcznej, możesz uruchomić polecenie CLI:

php bin/magento cache:enable

Możesz to również zrobić z poziomu administratora Magento, logując się jako administrator:

  1. Przejdź do System > Narzędzia > Zarządzanie pamięcią podręczną
  2. Wybierz typ pamięci podręcznej , który chcesz aktywować
  3. Z menu Akcje wybierz Włącz i kliknij Prześlij

Zrzut ekranu optymalizacji wydajności Magento

Użyj lakieru do całostronicowej pamięci podręcznej

Włączając pamięć podręczną całej strony, użyj Varnish do jej obsługi, a nie plików. Magento zdecydowanie zaleca stosowanie lakieru (lub Redis) w produkcji. Zintegrowane buforowanie całej strony (w systemie plików lub w bazie danych) jest znacznie wolniejsze niż Varnish, a Varnish został zaprojektowany w celu przyspieszenia ruchu HTTP.

Możesz znaleźć pełny przewodnik jak zainstalować i skonfigurować Varnish w oficjalnej dokumentacji Magento 2.

Aby skonfigurować Magento do używania Varnish, zaloguj się do administratora Magento jako administrator:

  1. Przejdź do Sklepy > Konfiguracja > Zaawansowane > System > Całą pamięć podręczną stron
  2. Z listy aplikacji buforującej kliknij buforowanie lakieru
  3. Wpisz wartość w polu TTL dla treści publicznych
  4. Rozwiń Konfiguracja lakieru i wprowadź szczegółowe informacje dotyczące konfiguracji lakieru

Optymalizacja wydajności Magento na całej stronie zrzut ekranu z pamięci podręcznej

Upewnij się, że pełnostronicowa pamięć podręczna działa: łatwo ją zepsuć

Całostronicową pamięć podręczną można łatwo zepsuć w Magento 2. Na przykład, jeśli chcesz wykluczyć blok z pamięci podręcznej, nie używaj atrybutu cacheable="false" w układzie XML podczas deklarowania bloku. Spowoduje to wyłączenie pamięci podręcznej dla całej strony zawierającej ten blok, nie tylko dla tego bloku. Widziałem, że to błąd popełniany przez ludzi.

Poszukaj atrybutu cacheable="false" w swoich układach i zobacz, na których blokach są one ustawione i na których stronach te bloki są wywoływane. W ten sposób możesz określić, czy trywialne strony mają problemy z pamięcią podręczną.

Możesz także sprawdzić, czy Twoja strona jest buforowana ręcznie. Przełącz sklep w tryb programisty w środowisku lokalnym lub scenicznym:

  1. Wyczyść pamięć podręczną Magento
  2. Załaduj stronę w przeglądarce
  3. Sprawdź nagłówki stron na karcie debugowania sieci w przeglądarce.
  4. Poszukaj X-Magento-Cache-Debug: MISS
  5. Odśwież stronę, powinna zmienić się na HIT

Jeśli nie zmieni się na HIT, oznacza to, że strona nie jest buforowana i pamięć podręczna nie działa.

Nie zapomnij włączyć trybu produkcyjnego

Magento ma trzy tryby działania: domyślny , deweloperski i produkcyjny .

Tryb produkcyjny jest przeznaczony do wdrożenia w systemie produkcyjnym. Ten tryb ukrywa wyjątki, obsługuje pliki statyczne tylko z pamięci podręcznej i nie pozwala na włączanie ani wyłączanie typów pamięci podręcznej w Magento Admin. Zapobiega również automatycznej kompilacji pliku kodu.

Podczas pracy i rozwoju sklepu aktywny jest tryb deweloperski. Nie zapomnij przełączyć się w tryb produkcyjny, gdy wdrażasz swoją witrynę na aktywnym serwerze!

Polecenie CLI, aby zobaczyć bieżący tryb, to:

php bin/magento deploy:mode:show

Polecenie CLI umożliwiające przejście do trybu produkcyjnego to:

php bin/magento deploy:mode:set production

Polecenie CLI do przełączenia w tryb programisty to:

php bin/magento deploy:mode:set developer

Więcej szczegółowych informacji na temat różnych trybów Magento znajdziesz tutaj.

Minifikacja CSS/JS

Minimalizacja plików CSS i JS jest ważnym elementem optymalizacji szybkości Magento 2. Minimalizując je, usuwamy wszystkie spacje, tabulatory i nowe wiersze w plikach. Wynikowe pliki będą miały mniej znaków, a tym samym mniejszy rozmiar, dzięki czemu będą się pobierać szybciej.

Magento ma wbudowaną tę funkcję i możesz włączyć minifikację CSS / JS w Administratorze. Aby włączyć minifikację JavaScript, wykonaj następujące kroki:

  1. przełącz Magento w tryb produkcyjny
  2. Przejdź do Sklepy > Konfiguracja > Zaawansowane > Deweloper
  3. Ustaw opcję Minimalizuj pliki JavaScript na Tak
  4. Zapisz konfigurację
  5. Opróżnij pamięć podręczną na stronie System > Zarządzanie pamięcią podręczną

Zrzut ekranu trybu produkcyjnego Magento

Aby włączyć minifikację CSS, wymagane są następujące kroki:

  1. przełącz Magento w tryb produkcyjny
  2. Przejdź do Sklepy > Konfiguracja > Zaawansowane > Deweloper > Ustawienia CSS
  3. Ustaw opcję Minimalizuj pliki CSS na Tak
  4. Zapisz konfigurację
  5. Opróżnij pamięć podręczną na stronie System > Zarządzanie pamięcią podręczną

Zrzut ekranu minifikacji Magento CSS

Uwaga: Nie łącz plików JS – po prostu je zminimalizuj .

Włącz płaskie stoły

Magento używa modelu EAV (wartość atrybutu encji), który przechowuje atrybuty swoich encji w wielu tabelach w zależności od ich typu wartości. Korzystanie z wielu tabel, sprzężenia i żądania w wielu tabelach są niezbędne do pobierania danych, co może spowolnić wykonywanie zapytań.

Magento ma możliwość wykorzystania płaskich tabel do katalogu i produktów. Tabele płaskie są tworzone przez scalenie wszystkich atrybutów encji w jedną tabelę. Żądając danych, musimy wysłać zapytanie do jednej tabeli, co znacznie przyspiesza.

Magento generuje i aktualizuje płaskie tabele przy każdej indeksacji. Możesz włączyć tabele płaskie, logując się do Magento Admin jako administrator:

  1. Przejdź do Sklepy > Konfiguracja > Katalog > Katalog > Storefront
  2. Wybierz Tak , aby użyć kategorii płaskiego katalogu
  3. Wybierz Tak , aby użyć produktu z płaskiego katalogu
  4. Zapisz konfigurację

Zrzut ekranu z płaskimi tabelami Magento

Wybierz szybki hosting Magento

Sprawdź minimalne wymagania Magento i sprawdź, czy Twój serwer je spełnia. Możesz zobaczyć oficjalne wymagania stosu technologii Magento 2.2.x tutaj.

Konfiguracja hostingu jest bardzo ważna dla wydajności Magento 2. Istnieją również dedykowane usługi hostingowe dla Magento, chociaż mogą one dotyczyć bardziej marketingu niż czegokolwiek innego.

Konkluzja: Uzyskaj najszybsze rozwiązanie hostingowe, na jakie możesz sobie pozwolić, chyba że jest to przesada dla Twojego projektu.

Optymalizacja obrazu Magento

Rozmiar twoich obrazów w oczywisty sposób wpływa na szybkość twojej witryny. Na przykład, jeśli masz stronę katalogu z 20 produktami, a każdy obraz produktu ma rozmiar 1 MB, oznacza to, że po załadowaniu strony zostanie pobrane łącznie 20 MB, co oczywiście może stanowić problem w niektórych sytuacjach (urządzenia mobilne, ograniczona przepustowość w niektórych regionach itp.).

Sprawdź, czy Twoje obrazy są odpowiednio zoptymalizowane i czy mają dobry stosunek jakości do rozmiaru. Upewnij się również, że twoje obrazy nie są zmieniane przez CSS, ale mają rozmiar pliku źródłowego przeskalowany do określonego rozmiaru, którego potrzebujesz.

Inną techniką jest użycie lazy loading, co oznacza wczytywanie obrazów po pełnym załadowaniu strony lub podczas przewijania katalogu przez użytkownika.

Możesz także użyć AWS lub CDN, aby znacznie szybciej dostarczać swoje treści. Rzućmy okiem na różnice między AWS, CDN i tradycyjnym hostingiem z perspektywy optymalizacji bitmap.

Hosting tradycyjny

Tradycyjnym sposobem jest przechowywanie treści, takich jak obrazy, na tym samym serwerze, co Twoja witryna. Może to zająć miejsce na dysku i znaczną część przepustowości, powodując znaczne obciążenie serwera. Oczywiście skalowanie przy tradycyjnym hostingu może być problemem.

CDN (sieć dostarczania treści)

Sieć dostarczania treści jest zwykle używana w celu zmniejszenia obciążenia serwera poprzez serwowanie części treści witryny. Poza tym zapewnia wysoką wydajność, zapewniając szybkie dostarczanie treści i wysoką dostępność przy użyciu wielu sieci do połączeń.

AWS (Amazon CloudFront)

Amazon CloudFront to wysoce bezpieczna sieć dostarczania treści (CDN), która zapewnia ochronę zarówno na poziomie sieci, jak i aplikacji. Sprawdź ten samouczek, aby dowiedzieć się, jak rozpocząć pracę z AWS i szybciej dostarczać treści.

Ponadto możesz użyć AWS do zmiany rozmiaru obrazów w locie na podstawie wymiarów przekazanych za pomocą parametru zapytania. Aby uzyskać dodatkowe informacje, zapoznaj się z tym samouczkiem dotyczącym zmiany rozmiaru obrazów za pomocą Amazon CloudFront i Lambda@Edge.

Ustaw indeksatory na „Aktualizuj zgodnie z harmonogramem”

Indeksatory Magento można ustawić w dwóch trybach: „ Aktualizuj zgodnie z zapisem ” lub „ Aktualizuj zgodnie z harmonogramem ”.

Gdy są ustawione na „Aktualizuj po zapisaniu” za każdym razem, gdy zapisujesz produkt, atrybut lub kategorię, określony indeks zaczyna działać. Indeksatory mogą pochłaniać zasoby, co może spowolnić Twój serwer.

Najlepszym trybem ustawienia indeksatorów jest „Aktualizacja zgodnie z harmonogramem”. W ten sposób masz pewność, że są one wykonywane przez zadanie crona w określonym przez Ciebie czasie. Wybierz czas, w którym ruch w Twojej witrynie jest niski.

Możesz wyświetlić bieżący tryb indeksatorów, uruchamiając polecenie:

php bin/magento indexer:show-mode

Lub w Magento Admin, przechodząc do:

System > Zarządzanie indeksami

Możesz zmienić tryb indeksatorów na "Aktualizuj zgodnie z harmonogramem", uruchamiając polecenie:

php bin/magento indexer:set-mode schedule

Możesz zmienić tryb indeksatorów na "Aktualizuj przy zapisywaniu", uruchamiając polecenie:

php bin/magento indexer:set-mode realtime

A oto w Magento Admin:

System > Zarządzanie indeksami: Wybierz wszystkie indeksatory i z listy rozwijanej Akcje wybierz "Aktualizuj zgodnie z harmonogramem"

tekst alternatywny obrazu

Możesz również skonfigurować Zaplanowane zadania, przechodząc do Administratora, aby:

Sklep > Ustawienia > Konfiguracja > Zaawansowane > System > Cron (zaplanowane zadania)

Rozwiń „Opcje konfiguracji Crona dla grupy: indeks”

Okno konfiguracji Magento crona

Kompresja GZIP

Gzip to metoda kompresji plików w celu szybszego przesyłania danych w sieci. Kompresja umożliwia serwerowi internetowemu dostarczanie mniejszych rozmiarów plików, które ładują się szybciej dla użytkowników witryny. Jednak ma to swoją cenę.

Podczas kompresji pliku ładujesz procesor, a im bardziej skompresujesz plik, tym dłużej trwa proces. Chociaż może to zwiększyć obciążenie procesora serwera, może również znacznie zmniejszyć wykorzystanie przepustowości. Dzięki gzip możesz wybierać między różnymi poziomami kompresji, od 1 do 9.

Na poziomie 1 masz najszybszy czas kompresji, ale niższy współczynnik kompresji. Z drugiej strony, na poziomie 9 masz najwyższy stopień kompresji, ale niższą prędkość. Domyślna konfiguracja gzip używa poziomu 6, faworyzując kompresję nad szybkością. Nginx używa jednak poziomu 1, przedkładając szybkość nad rozmiar pliku.

Aby włączyć kompresję gzip i aktywować moduł mod_deflate Apache, możesz to dodać, aktualizując plik .htaccess i odkomentuj odpowiednie wiersze, jak pokazano poniżej. Moduł mod_deflate kompresuje zasoby statyczne do mniejszych plików przed przesłaniem ich do przeglądarki.

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

Użyj Elasticsearch na stronach katalogu i w wyszukiwarce

Innym sposobem na zwiększenie szybkości witryny jest użycie Elasticsearch dla stron katalogu i wyników wyszukiwania. Skonfiguruj serwer Elasticsearch i podłącz do niego swój sklep Magento. Wyszukiwanie staje się znacznie szybsze dzięki zastosowaniu Elasticsearch.

Ten oficjalny przewodnik wyjaśnia, jak skonfigurować Magento z Elasticsearch.

Aby skonfigurować Magento do korzystania z Elasticsearch, zaloguj się do administratora Magento jako administrator:

  1. Kliknij Sklepy > Ustawienia > Konfiguracja > Katalog > Katalog > Wyszukiwanie w katalogu .
  2. Z listy Wyszukiwarka kliknij Elasticsearch lub Elasticsearch 5.0+ , jak pokazano na poniższym rysunku. (Opcja Elasticsearch 5.0+ nie jest dostępna dla Magento 2.1.)

Konfiguracja Elasticsearch w Magento

Sprawdź, czy nie ma niepotrzebnych połączeń Ajax

Wywołania zwrotne do serwera po załadowaniu strony mogą powodować blokady sesji. Sposobem na sprawdzenie wszystkich wywołań Ajax, które wykonuje twoja strona, jest użycie DevTools w Chrome. Możesz go otworzyć, klikając prawym przyciskiem myszy na stronie i wybierając Sprawdź.

Przejdź do zakładki sieci i tam możesz filtrować żądanie według XHR. Teraz możesz zobaczyć wszystkie żądania Ajax strony i sprawdzić je, aby zobaczyć, które z nich są niezbędne na tej konkretnej stronie.

Ajax wzywa w Magento

Redis dla pamięci podręcznej strony i przechowywania sesji

Redis to opcjonalne rozwiązanie pamięci podręcznej zaplecza, które zastępuje Zend_Cache_Backend_File , który jest domyślnie używany w Magento 2.

Dlaczego warto korzystać z Redisa?

Korzystanie z Redis może mieć wiele zalet:

  • Możesz zastąpić memcached przez Redis, ponieważ może być używany również do przechowywania sesji PHP.
  • Redis obsługuje zapisywanie na dysku i replikację master/slave, która jest bardzo pożądaną funkcją, która nie jest obsługiwana przez memcached. Replikacja pozwala uniknąć pojedynczego punktu awarii i zapewnia wysoką dostępność.
  • Operacje na znacznikach nie wymagają pełnego skanowania każdego pliku pamięci podręcznej, ponieważ Redis działa poprzez indeksowanie znaczników w plikach.
  • Back-end obsługuje czyszczenie pamięci podręcznej na podstawie tagów bez pętli foreach.

Jest też główny minus:

  • Ponieważ Redis jest magazynem w pamięci, wszystkie dane muszą zmieścić się w pamięci, co oznacza, że ​​ogranicza ją tylko szybkość i pojemność pamięci RAM.

Skonfiguruj Magento do korzystania z Redis do przechowywania sesji

Poniżej znajduje się przykładowa konfiguracja do dodania do <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' ) ),

Tutaj możesz sprawdzić wszystkie szczegóły dotyczące parametrów i jak przeprowadzić podstawową weryfikację, czy Twoja instalacja Redis współpracuje z Magento.

Skonfiguruj Magento do korzystania z Redis dla strony i domyślnej pamięci podręcznej

Istnieją dwa sposoby skonfigurowania Redis dla strony i domyślnej pamięci podręcznej. Możesz ręcznie edytować plik <katalog <Magento install dir>app/etc/env.php lub użyć wiersza poleceń, co jest zalecaną metodą, ponieważ zapewnia również walidację.

Dla domyślnej pamięci podręcznej uruchom polecenie:

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

Określ parametry, które są specyficzne dla domyślnego buforowania Redis.

Dla pamięci podręcznej strony uruchom polecenie:

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

To polecenie włącza buforowanie stron Redis, ustawia hosta na redis.example.com i przypisuje numer bazy danych do 1. Możesz sprawdzić wszystkie szczegóły na Magento DevDocs.

Podsumowanie optymalizacji wydajności Magento

Omówiliśmy kilka podejść do optymalizacji wydajności Magento 2, więc zróbmy krótkie podsumowanie.

Identyfikowanie i rozwiązywanie wąskich gardeł ma ogromne znaczenie w przetwarzaniu danych. Korzystanie z całostronicowej pamięci podręcznej i lakieru poprawi również szybkość Twojej witryny i przyspieszy ruch HTTP. Zawsze powinieneś używać Magento w trybie produkcyjnym na swoim serwerze na żywo, bez wymówek. Użyj minifikacji, aby zmniejszyć rozmiar plików CSS i JS, mniejszy plik będzie zarówno pobierany szybciej, jak i zużywa mniej przepustowości.

Włącz tabele płaskie, aby zmniejszyć żądania bazy danych i skrócić czas odpowiedzi bazy danych. Zoptymalizuj swoje obrazy i korzystaj z sieci CDN, jeśli to możliwe. Ustaw indeksatory, aby aktualizowały się zgodnie z harmonogramem i włącz cron Magento. Włączenie kompresji gzip zmniejszy również rozmiar pobieranych plików. Korzystanie z Elasticsearch zwiększy szybkość stron katalogu, a strona wyników wyszukiwania będzie się ładować znacznie szybciej. Użyj Redis do pamięci podręcznej stron i przechowywania sesji, która jest znacznie szybsza niż domyślna pamięć podręczna.

Możesz wdrożyć wszystkie te zalecenia lub tylko kilka, z których do tej pory nie korzystałeś. Nawet para powinna wystarczyć, aby poprawić wydajność Magento, co, miejmy nadzieję, powinno przełożyć się na więcej konwersji.