- Profilowanie żądań bazy danych
- Profilowanie PHP VirtueMart za pomocą narzędzia XHprof
- Optymalizacja VirtueMart: wyniki
- Optymalizacja VirtueMart: ulepszenia
Wyzwaniem była optymalizacja VirtueMart . Zahamował wizytówkę towarów. Początkowo podejrzenie padło na bazę danych.
Profilowanie żądań bazy danych
Profilowanie perkonoy nie ujawnił niczego kryminalnego:
# Ogółem: 38 łącznie, 16 unikalnych, 0 QPS, 0x współbieżności ____________________ # Łączny atrybut min max avg 95% stddev mediana # ========================= == ======= ======= ======= ======= ======= # Czas wykonywania 405ms 10ms 11ms 11ms 11ms 364us 10ms # Czas blokady 0 0 0 0 0 0 # # Wiersze wysłane 0 0 0 0 0 0 0 # Wiersze badają 0 0 0 0 0 0 # # Rozmiar zapytania 15.76k 39 738 424,82 719,66 255,28 487,09
Całkowita objętość wszystkich odpowiedzi bazy danych wynosi 15,76k, co najmniej 39 bajtów, maksimum to 738, czas wykonywania wynosi 405 milisekund, minimum to 10 ms, a maksimum to 11.
Dane zostały uzyskane bez użycia pamięci podręcznej zapytań, nie zawierały „szybkich” zapytań, które były wykonywane przez mniej niż 0,01 sekundy.
Oczywiście 0,4 sekundy na bazę danych. Musimy starać się wydać nie więcej niż 0,2 sekundy na całą stronę.
Same zapytania są dość szybkie, nie ma specjalnej potrzeby optymalizacji. Biorą „ilość”.
W sytuacji, gdy otwarcie strony zajmuje 3 sekundy, hamulce z bazą danych 0,4 sekundy nie są wąskim gardłem. Po „rozgrzaniu” pamięci podręcznej zapytań czas ten znacznie się zmniejszy.
Pozostałe dane są normalne. Bez długich żądań.
Profilowanie PHP VirtueMart za pomocą narzędzia XHprof
Powyżej - wyniki profilowania przy użyciu VirtueMart 2.0.20b Xhprof . Wykonano profilowanie strony prezentacyjnej produktu.
Runtime - 1,1 sekundy, z włączoną pamięcią podręczną zapytań, tak jak w bieżącej witrynie.
Po pobraniu próbek produktów zgodnie z warunkiem getProductListing, w skrypcie dla każdego produktu, pobierane są szczegółowe informacje z getProductSingle.
Zajmuje to 50% czasu (IWall), a proces ten jest uruchamiany dla każdego produktu - łącznie 126 razy (połączenia).
Każde wywołanie getProductSingle powoduje, że pięć zapytań do bazy danych (według kodu) => 630 zapytań. Na zdjęciu 1737 to całkowita liczba dla całej strony.
Baza danych z wieloma zapytaniami VirtueMart radzi sobie z łatwością - tylko 10% całkowitego czasu (mysqli_query). Dziękuję za pamięć podręczną!
Prawidłowo powinno się to robić w ten sposób: po uzyskaniu wszystkich informacji o wybranych produktach jest ono rozproszone. Więc kosztuj pięć wniosków.
Optymalizacja VirtueMart: wyniki
VirtueMart zwalnia z powodu nieprawidłowego wdrożenia odbioru listy produktów, jakość tego kodu pozostawia wiele do życzenia. Przyspieszenie w pracy z bazą danych niczego nie przyniesie.
Trzy opcje:
Optymalizacja VirtueMart: ulepszenia
Od wersji do wersji może się różnić. Oto mój przypadek:
administrator / components / com_virtuemart / models / product.php
funkcja publiczna getProduct ($ virtuemart_product_id = NULL, $ front = TRUE, $ withCalc = TRUE, $ onlyPublished = TRUE, $ ilość = 1, $ customfields = TRUE, $ virtuemart_shoppergroup_ids = 0) {if (true &&! pusty ($ virtuemart_product_id) && $ front && JFactory :: getConfig () -> get ('caching')> = 1) {if (! class_exists ('CurrencyDisplay')) {wymagaj (JPATH_VM_ADMINISTRATOR. DS. „Pomocnicy”. DS. „Currencydisplay.php”); // inny błąd 503} if ($ virtuemart_shoppergroup_ids! = 0 i is_array ($ virtuemart_shoppergroup_ids)) {$ virtuemart_shoppergroup_idsString = implode ('', $ virtuemart_shoppergroup_ids); } else {$ virtuemart_shoppergroup_idsString = $ virtuemart_shoppergroup_ids; } $ withRating = $ this -> withRating? TRUE: 0; $ productKey = $ virtuemart_product_id. „-”. $ front. „-”. $ withCalc. „-”. $ onlyPublished. „-”. $ ilość. „-”. $ customfields. „-”. $ virtuemart_shoppergroup_idsString. „-”. $ withRating; $ mycache = JFactory :: getCache ('com_virtuemart_speedup', ''); $ mycache -> setLifeTime (86400); $ cache_content = $ mycache -> get ($ productKey); jeśli (! is_object ($ cache_content)) {$ cache_content = $ this -> _getProduct ($ virtuemart_product_id, $ front, $ withCalc, $ onlyPublished, $ amount, $ customfields, $ virtuemart_shoppergroup_ids); $ mycache -> store ($ cache_content, $ productKey); } return $ cache_content; } else {return $ this -> _getProduct ($ virtuemart_product_id, $ front, $ withCalc, $ onlyPublished, $ amount, $ customfields, $ virtuemart_shoppergroup_ids); }} public function _getProduct ($ virtuemart_product_id = NULL, $ front = TRUE, $ withCalc = TRUE, $ onlyPublished = TRUE, $ ilość = 1, $ customfields = TRUE, $ virtuemart_shoppergroup_ids = 0) {// stara wersja funkcji _getProduct}