Laravel Performance-Optimierung
Performance-Optimierungen werden meist kurz vor oder kurz nach dem Deployment einer Anwendung vorgenommen. Laravel-Anwendungen bieten von sich aus schon einige sinnvolle Caching-Methoden an.
Artisan-Befehle zum Caching
Wichtig: nach dem Ausführen eines Caching-Befehls, werden Änderungen an der entsprechenden Konfiguration nicht mehr übernommen. Der Cache muss dafür erst einmal wieder geleert werden. Dafür wird an die beiden folgenden Befehle ein „clear“ anstelle von „cache“ genutzt, zum Beispiel php artisan config:clear für das Leeren des Konfigurations-Caches.
php artisan config:cache
Dieser Befehl cached die Konfigurationsdateien der Anwendung.
php artisan route:cache
Hiermit werden die Routen-Definitionen der Anwendung gecached. Hier muss aber unbedingt darauf geachtet werden, dass das Caching nur funktioniert wenn keine Routen mit Closures definiert wurden. Stattdessen sollte man alles Routen Controller-basiert behandeln.
Composer Autoloader Caching
Composer dumpautoload -o
weist Composer an, ein neues Mapping von Klassen auf Dateien zu erzeugen. Es macht also Sinn diesen Befehl jedes Mal auszuführen wenn wieder neue Php-Dateien zur Anwendung hinzugekommen sind.
Oft genutzte Daten im RAM cachen
Oft genutzte Daten, wie zum Beispiel die einer Session sollten am besten im RAM des Servers gecached werden.
Gängige Systeme dafür sind Memcached oder Redis.
Laravel enthält bereits Treiber für beide Systeme, so dass man eigentlich nur noch für deren Installation auf dem Server sorgen muss.
Für Redis muss zusätzlich das Composer-Modul Predis installiert werden (composer require predis/predis
).
Anschließend lässt sich das gewünschte System inklusive Host und Port in der .env-Datei eintragen. Dafür sind beispielhafte Einträge schon in .env.example enthalten.
Caching im Code nutzen
Im Anwendungscode selbst lassen sich auch gezielt Datensätze in den Cache legen. Dafür muss lediglich die Cache-Klasse eingebunden werden mit use Illuminate\Support\Facades\Cache
Mit Cache::get($key)
und cache::put($key, $value)
werden Schlüssel/Wert-Paare dann in den entsprechenden Cache gelegt bzw. abgerufen.
Eloquent queries optimieren
Bei Eloquent-Modellen, die in Relationen zu anderen Modellen stehen, kann es unter Umständen zu ziemlich starken Performance-Einbußen beim Abfragen dieser Relationen kommen.
Der Grund dafür ist, dass Eloquent einen "lazy loading"-Ansatz beim Abfragen der Relationen verfolgt. Das bedeutet, dass die Werte aus verknüpften Modellen erst dann
aus der Datenbank geladen werden, wenn sie im Code an irgendeiner Stelle explizit genutzt werden. Das ist durchaus sinnvoll, wenn dies nur für wenige, einzelne Objekte aus
diesem Modell passiert. Es wird dann im Prinzip jeweils eine weitere Query ausgeführt, um die verknüpften Daten "nachzuladen".
Sollen diese Daten aber bei allen Objekten mitgeladen werden, sollte das unbedingt bei der Eloquent-Abfrage direkt mitangegeben werden, um beide Abfragen in einer Query zu kombinieren.
Das funktioniert mit der ->with()
-Funktion.
Möchte man zum Beispiel alle User und deren User-Rolle abrufen, könnte das so aussehen:
User::with(['user_role'])->get();
Das funktioniert natürlich auch mit mehreren Relationen.
User::with(['user_role', 'user_address'])->get();
Weitere Optimierungen im Frontend
Je nachdem, wie viele Bilddateien von der Anwendung geladen werden, kann es sich lohnen auf ein externes Content Delivery Network (CDN) zurückzugreifen um oft geladene oder besonders große Dateien dorthin auszulagern.
Wenn eine Anwendung recht umfangreiche CSS-Dateien oder JavaScript-Dateien lädt, sollten diese für die Live-Umgebung optimiert werden.
Laravel enthält von Werk an schon eine Webpack-Integration mit VueJs und SASS, so dass man dort per npm run production
eine optimierte Live-Version der CSS und JS-Teile bauen kann.
Gerade für den Frontend-Bereich gibt es noch eine Menge anderer Optionien zum Komprimieren wie zum Beispiel die Task-Runner grunt oder gulp.
Du arbeitest in einer Agentur oder als Freelancer?
Dann wirf doch mal einen Blick auf unsere Software FeatValue.
Über uns
Wir entwickeln Webanwendungen mit viel Leidenschaft. Unser Wissen geben wir dabei gerne weiter. Mehr über a coding project