Wolne działanie to jeden z najpoważniejszych problemów sklepu internetowego, to częsty problem sklepów budowanych przez osoby początkujące lub administrowane przez osoby bez większego doświadczenia.
Silnik PrestaShop nie jest tu wyjątkiem, wersja 1.7 została przepisana pod framework Symfony i ma bardzo dobry profiler jednak starsze wersje 1.5 i 1.6 też posiadają prosty ale w większości przypadków wystarczające narzędzie do lokalizacji problemów wydajności silnika i o nim będzie mowa w tym krótkim poradniku.
Aby włączyć profiler PrestaShop trzeba edytować plik
config/defines.inc.php
zmieniamy _PS_DEBUG_PROFILING_ na true.
/* Debug only */ define('_PS_MODE_DEV_', false); if (_PS_MODE_DEV_) { @ini_set('display_errors', 'on'); @error_reporting(E_ALL | E_STRICT); define('_PS_DEBUG_SQL_', true); /* Compatibility warning */ define('_PS_DISPLAY_COMPATIBILITY_WARNING_', true); } else { @ini_set('display_errors', 'off'); define('_PS_DEBUG_SQL_', false); /* Compatibility warning */ define('_PS_DISPLAY_COMPATIBILITY_WARNING_', false); } define('_PS_DEBUG_PROFILING_', false); define('_PS_MODE_DEMO_', false);
Po tej zmianie na każdej stronie sklepu (również w panelu) pojawi się raport działania profilera:
Danych jest sporo ale kluczowe jest podsumowanie w pierwszej części raportu, widzimy tam całkowity czas ładowania strony oraz czas ładowanie poszczególnych hook'ów.
Na powyższym przykładzie widzimy że całkowity czas ładowania strony to 1.856s z czego większość czasu to hook displayLeftColumn.
Wiemy zatem że problem powoduje moduł działający w danej pozycji, teraz wystarczy tylko zalogować się do panelu i sprawdzić moduły wyłączając je kolejno ( Admin > Moduły > Pozycje - polecam zacząć od tych nienatywnych :)). W tym konkretny przypadku po wyłączeniu modułu "blockuseronline" wynik to:
Z mojego osobistego doświadczenia tego typu problemy to około 70% przypadków, pozostałe to:
- Brak włączonego cache (Admin > Zaawansowane > Wydajność)
- Wymuszona kompilacja SMARTY (Admin > Zaawansowane > Wydajność)
- Błędy szablonu
- Modyfikacje silnika
Ekstra tip: profiler PrestaShop 1.5x nie lubi się z błędami/ostrzeżeniami PHP a te to częsty problem jeśli sklep jest mocno zmodyfikowany, w takim przypadku edytujrmy
tools/profiling/Controller.php
i komentujemy die();
function developpementErrorHandler($errno, $errstr, $errfile, $errline) { if (!(error_reporting() & $errno)) return; ... //die; return true; }