Badania pokazują, że 53% użytkowników opuszcza stronę, która ładuje się dłużej niż 3 sekundy. Każda sekunda opóźnienia to mniej konwersji, gorsze SEO i wyższe koszty infrastruktury. Optymalizacja wydajności aplikacji Laravel to nie luksus, ale konieczność w dzisiejszym konkurencyjnym środowisku.
W tym poradniku pokażę Ci, które optymalizacje dają największy zysk przy najmniejszym nakładzie pracy. Zaczniesz od prostych zmian, a skończysz na zaawansowanych technikach, które stosuję w profesjonalnych projektach.
Eliminacja problemu N+1 w zapytaniach
Najczęstsza przyczyna wolnych aplikacji Laravel to problem N+1. Wyobraź sobie pętlę, która dla każdego zamówienia wykonuje osobne zapytanie o dane klienta. Przy 100 zamówieniach to 101 zapytań zamiast 2. Rozwiązanie jest proste: używaj eager loadingu z metodą with(). Zamiast Order::all(), pisz Order::with('customer')->get(). To jeden z najłatwiejszych i najbardziej efektywnych sposobów na przyspieszenie aplikacji.
Warto też korzystać z lazy eager loadingu, gdy nie wiesz z góry, które relacje będą potrzebne. Metoda load() pozwala załadować relacje dopiero wtedy, gdy są faktycznie używane.
Cache'owanie wyników zapytań i widoków
Laravel oferuje potężny system cache'owania z wsparciem dla Redis, Memcached i plików. Cache'uj wyniki zapytań, które nie zmieniają się często: lista kategorii, konfiguracja, statyczne treści. Redis to doskonały wybór jako backend cache — jest szybki, niezawodny i łatwy w konfiguracji.
Nie zapominaj też o cache'owaniu widoków. Dyrektywa @cache w Blade pozwala zachować fragment widoku w cache'u na określony czas. To szczególnie przydatne dla ciężkich widoków z wieloma relacjami.
Kolejki dla ciężkich operacji
Ciężkie operacje, takie jak wysyłka maili, generowanie PDF-ów czy integracje z zewnętrznymi API, przenieś do kolejek. Użytkownik nie powinien czekać na zakończenie tych zadań. Laravel Queue z Redis jako driverem to sprawdzone rozwiązanie, które stosuję w każdym projekcie.
Dodatkowo, kolejki pozwalają na retry nieudanych zadań i monitorowanie ich stanu przez Laravel Horizon.
Indeksy w bazie danych
Sprawdź, czy kluczowe kolumny w zapytaniach mają indeksy. Brak indeksu na kolumnie status w tabeli z milionem rekordów to gwarancja wolnych zapytań. Używaj narzędzia EXPLAIN w PostgreSQL lub MySQL, aby zdiagnozować, które zapytania wymagają optymalizacji.
Pamiętaj jednak, że indeksy przyspieszają odczyt, ale spowalniają zapis. Zakładaj indeksy tylko na kolumnach, które są faktycznie używane w warunkach WHERE, JOIN, ORDER BY.
Lazy loading obrazów i optymalizacja assetów
Obrazy stanowią średnio 60% wagi strony. Użyj atrybutu loading=lazy dla obrazów poniżej linii cięcia, skompresuj obrazy przed wgraniem na serwer i rozważ użycie formatu WebP zamiast JPEG czy PNG.
Dla assetów CSS i JavaScript korzystaj z Vite, który domyślnie buduje i minifikuje te pliki. Pamiętaj też o uruchomieniu php artisan optimize przed wdrożeniem na produkcję — to kompiluje konfigurację, routing i widoki do cache'u.
Podsumowanie
Optymalizacja wydajności to proces ciągły, nie jednorazowe zadanie. Zacznij od największych zysków: eliminacji N+1, cache'u Redis i kolejek. Monitoruj wydajność narzędziami takimi jak Laravel Debugbar, Telescope czy PostgreSQL EXPLAIN.
Najczęściej zadawane pytania
Który cache backend jest najlepszy dla Laravela?
Redis jest zdecydowanie najlepszym wyborem dla aplikacji produkcyjnych. Jest szybki, niezawodny i wspiera wszystkie funkcje cache'owania Laravela.
Jak sprawdzić, czy aplikacja ma problem N+1?
Użyj Laravel Debugbara — pokaże liczbę zapytań na każdej stronie. Jeśli widzisz setki zapytań zamiast kilkunastu, masz problem N+1.
Czy kolejki są potrzebne w małej aplikacji?
Nawet w małej aplikacji warto używać kolejek dla operacji takich jak wysyłka maili. Dzięki temu użytkownik nie czeka na wysłanie wiadomości, a Ty masz pewność, że e-maile zostaną dostarczone nawet przy chwilowych problemach z serwerem SMTP.
Optymalizacja zapytań z użyciem Explain
Gdy aplikacja zwalnia, pierwszym krokiem jest diagnostyka. Włącz Laravel Debugbar lub Telescope i sprawdź, które zapytania trwają najdłużej. Następnie skopiuj wolne zapytanie i wykonaj EXPLAIN ANALYZE w PostgreSQL. To pokaże, czy zapytanie korzysta z indeksów, czy przeszukuje całą tabelę.
Często okazuje się, że brakuje indeksu na kluczowej kolumnie. W PostgreSQL możesz tworzyć indeksy częściowe (WHERE status = 'active'), które są mniejsze i szybsze niż pełne indeksy, jeśli zapytania zawsze filtrują po określonej wartości.
Optymalizacja konfiguracji PHP i serwera
Nie zapominaj o konfiguracji samego PHP. Opcje takie jak opcache.memory_consumption, opcache.max_accelerated_files i realpath_cache_size mają ogromny wpływ na wydajność aplikacji Laravel. Dla serwera produkcyjnego warto ustawić opcache.memory_consumption na co najmniej 128 MB.
Konfiguracja FPM też ma znaczenie. Dostosuj pm.max_children, pm.start_servers, pm.min_spare_servers i pm.max_spare_servers do obciążenia serwera. Zbyt mała liczba procesów FPM powoduje kolejkowanie żądań, zbyt duża prowadzi do wyczerpania pamięci. Dla Laravela dobrze sprawdza się tryb dynamic z wartościami dostosowanymi do dostępnej pamięci RAM.
CDN i caching warstwy aplikacji
Dla zasobów statycznych warto skonfigurować CDN i odpowiednie nagłówki Cache-Control. Varnish lub Nginx FastCGI Cache mogą przechowywać gotowe odpowiedzi HTML, odciążając PHP. W Laravelu możesz też użyć middleware do cache'owania całych odpowiedzi za pomocą pakietów takich jak spatie/laravel-responsecache.
👉 Potrzebujesz podobnego rozwiązania? Sprawdź naszą ofertę Laravel Development i zobacz, jak możemy pomóc Twojej firmie.
👉 Zobacz FamilyTimelineApp — organizacja czasu dla rodzin i grup.
📖 Zobacz case study: Aplikacja CRM i portal klienta — 50% mniej czasu na obsługę.