info@a-coding-project.de

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.

Wir helfen gerne bei der Performance-Optimierung

Sollte deine Anwendung trotz diesem Tutorial noch langsam sein, melde dich gerne bei uns.

zum Angebot

Über uns

Stefan Wienströer

Wir entwickeln Webanwendungen mit viel Leidenschaft. Unser Wissen geben wir dabei gerne weiter. Mehr über a coding project

Auch interessant