W jaki sposób zoptymalizować i naprawdę przyspieszyć (cache) PrestaShop 1.6

W jaki sposób zoptymalizować i naprawdę przyspieszyć (cache) PrestaShop 1.6

Wielu webdeveloperów wie jak ważna jest finalna optymalizacja wydajności stworzonego projektu. To od niej zależy czy potencjalny klient/użytkownik będzie chciał skorzystać z nowego dzieła.

Wyobraź sobie sytuację że masz super sklep internetowy oparty o PrestaShop w wersji 1.6. Niestety czas ładowania strony głównej trwa kilkanaście sekund zamiast kilka a ładowanie kategorii głównej z kilkoma tysiącami produktów doprowadza do szaleństwa serwer a użytkownik widzi błąd „500 – Internal Server Error”.
Jest to nie do pomyślenia a potencjalny klient na 99% ominie sklep.
I właśnie taka sytuacja wyeksploatowała kilka moich ostatnich dni.

W internecie znajduje się bardzo wiele podobnych „świetnych” poradników które głównie opisują zachowanie sklepu na bardzo wydajnym VPS’ie bądź dedykowanym serwerze – gdzie jako zwiększenie wydajności wystarczy CCC (combine, compress and cache) by PrestaShop oraz odpowiednio skonfigurowany (typu włącz i gotowe) system Cache by PrestaShop np. Memcache, APC, xcache czy CacheFS.
Wszystko świetnie lecz tak jak już napisałem, wymaga to bardzo mocnej maszyny z dużą ilością RAMu gdzie i tak efekt końcowy może być niezachwycający.

Sklep który uznałem że zoptymalizuję wykorzystuje najnowszą stabilna wersję Presty 1.6 a stoi na ekonomicznym serwerze VPS o parametrach:

  • OpenVZ
  • CentOS 6.5 (Apache 2.2, MySQL 5.1, PHP 5.5[php55w], Virtualmin oraz Webmin)
  • 2x vCore – AMD FX(tm)-8320 Eight-Core Processor (2811 MHz)
  • 3GB RAM
  • 512MB SWAP
  • 50GB (marnego) SSD
  • Łącze 25/25MB

Można powiedź że dość dobry VPS lecz ze względu na ekonomiczna ofertę wydajność jest znacząco zaniżona.

Efekt który udało mi się osiągnąć jest wręcz rewelacyjny, ładowanie strony kategorii (3 tysiące produktów) spadło z błędu limitu czasu wykonywania PHP (przy Memcache) lub 15 sekund (bez cache) do 1-3 sekund.

Postaram się w tym poradniku połączyć to co znalazłem na wielu zagranicznych forach/poradnikach z własnym zdobytym w bojach doświadczeniem.

Chciałbym przestrzec Ciebie przed szybkim zniechęceniem bądź słabymi efektami – robiąc ten poradnik nie chcę stworzyć 100% „how to” bazującego na zrób wszystko co napisałem a będzie super. Raczej jest to swoisty zbiór pomysłów które przy odpowiednim zastosowaniu mogę przynieść ogromne profity!

Pamiętaj również że opisuję tutaj operacje na ekonomicznym VPSie (z pełnymi uprawnienami root’a na CentOS 6.5 i 3GB RAM) który powinien obsłużyć max 10 klientów wysyłających na raz żądania przy bazie około 5 tysięcy produktów z bardzo rozbudowanymi kombinacjami.

Tak więc do dzieła!

Głównymi założeniami są:

  • Przechowywanie Cache Smarty w pamięci RAM
  • Zaoszczędzenie zapytań SQL po stronie PrestaShop używając CacheFS w pamięci RAM
  • Zaoszczędzenie czasu odpytywania MySQL dzięki cache i buforom InnoDB
  • Zastąpienie CCC przez mod_pagespeed
  • Zastosowanie php opcode
  1. Zapomnij o memcache(ostateczność!)/php-apc/xcache
  2. Zapomnij o CCC
    prestashop_16_ccc

    1. Inteligentna pamięć podręczna dla CSS: NIE
    2. Inteligentna pamięć podręczna dla JavaScript: NIE
    3. Minimalizuj HTML: NIE
    4. Kompresuj JavaScript zawarty w plikach HTML: NIE
    5. Move JavaScript to the end: NIE
    6. Optymalizacja Apache: TAK
  3. Pokochaj Cache Smarty
    prestashop_16_smarty_cache

    1. Kompilacja szablonu: Skompiluj ponownie szablony jeżeli pliki zostały zaktualizowane
    2. Pamięć podręczna: TAK
  4. Użyj biblioteki mcrypt i algorytmu Rijndael
    prestashop_16_mcrypt

    1. Algorytm: Użyj biblioteki mcrypt i algorytmu Rijndael (rekomendowane) (musisz zainstalować Rozszerzenie Mcrypt)
  5. Zastosuj CacheFS
    prestashop_16_cachefs

    1. Użyj cache: TAK
    2. System cache’u: System plików
    3. Głębokość folderu: minimum 1 (optymalnie podczas testów zwiększać stopniowo wartość)
  6. Odpowiednio skonfiguruj bufory i cache InnoDB (MySQL)

    1. innodb_buffer_pool_size: minimum 512GB (im więcej tym lepiej)
    2. innodb_thread_concurrency: 2 * [ilość rdzeni CPU] + 2
    3. query_cache_size: minimum 64MB (im więcej tym lepiej)
    4. query_cache_limit: 2MB (im więcej tym lepiej)

    Przykładowa konfiguracja MySQL 5.1

  7. Wybierz najlepiej PHP 5.5+(CentOS 6.5: https://webtatic.com/packages/php55/)
  8. Zaprzyjaźnij się z Zend OPcache (yum install php55w-opcache)!
    Przykładowa konfiguracja Zend OPcache:

  9. Skonfiguruj odpowiednio PHP:

  10. Zastosuj mod_pagespeed
    Instalacja: https://developers.google.com/speed/pagespeed/module/download?hl=pl
    Przykładowa konfiguracja mod_pagespeed (pamiętaj o ścieżce do kontenera przechowującego w pamięci dane cache, polecam zastosować %ścieżka do presty%/cache/pagespeed – ważne dla TMPFS):

    Przykładowa dodatkowa konfiguracja do .htaccess dla Presty:

  11. Zastosuj mod_deflate
    Instalacja:https://www.brighterlamp.com/2010/10/how-to-enable-mod_deflate-on-apache-to-optimize-page-speed/
  12. Konfiguracja TMPFS NAJWAŻNIEJSZE!!!
    Zasadniczo jest to punkt kulminacyjny zwiększenia wydajności!
    Założenie jest proste, chodzi o to aby w łatwy i szybki sposób przechowywać kluczowe dane bezpośrednio w pamięci RAM serwera.Wystarczy wykorzystać odpowiednio polecenie mount (uwaga działa to tylko do restartu serwera!):

    Wartością size=xyzM można dowolnie manipulować, oczywiście im więcej tym lepiej (pamiętaj o pamięci RAM), ważne też aby monitorować stan naszych cache używając polecenia df –h oraz w razie potrzeby zwiększać wartości size.
    Polecam napisać prosty skrypt w bashu monitorujący co np. 1min (cron) wielkość zamontowanych folderów oraz w razie potrzeby użyć rm -rf * na wybranym folderze (skrypt poniżej 🙂 ).
    Aby wszystkie zmiany były widoczne po resecie, polecam zapisać wszystkie polecenia mount do /etc/rc.local.

  13. Testowanie 😀
    Rekomenduję kilka razy odświeżać strony sklepu i zobaczyć efekt.
  14. Dodatkowo dodaj poniższy kod do .htaccess w folderze administracyjnym:

Dodatkowo udostępniam prosty skrypt pozwalający kontrolować tmpfs:

 

Polecam również pobawić się z workerem Apache2 mpm zamiast prefork oraz wykorzystać php-fpm (ja osobiście używam fcgi).

Jeżeli taki typ cache nie jest dla Ciebie satysfakcjonujący proponuję pobawić się z Memcache’m, Varnish’em lub jakimś wydajnym CDN’em. Ciekawym rozwiązaniem będzie także wykorzystanie zamiast TMPFS dedykowanego dysku SSD a najlepiej jakiegoś RAID (pomocne może być również przechowywanie w osobnych lokalizacjach zdjęć produktów).

Mam nadzieję że mój poradnik był dla Ciebie pomocny, zapraszam do komentowania 😀

Źródła:
http://www.prestamodulemarket.com/en/module/stblog/3_how-to-speed-prestashop-up-guide.html
http://www.gxjansen.com/101-ways-to-speed-up-your-magento-e-commerce-website/
http://php.net/manual/en/book.opcache.php
http://www.prestashop.com/blog/en/your-prestashop-store-is-twice-as-fast-with-zend-opcache/

KolekcjaStylu.pl

KolekcjaStylu.pl

Wykonanie sklepu internetowego oraz pozycjonowanie – KolekcjaStylu.pl, opartego o system PrestaShop.

Data: 1 wrze 2013
Dla: „Koliber” Natalia Kołodziej

Zakres moich prac:
1. Projekt sklepu w Photoshop
2. Wykonanie stylu PrestaShops
3. Implementacja systemów płatności online
4. Synchronizacja produktów z A2C
5. Pozycjonowanie dla wielu fraz

Link: Moda damska
http://kolekcjastylu.pl/

Very simple and creative Clash royale hack - check it and use. | Catch super pokemons and use Pokemon GO hack - universal online application.