Eine langsame Anwendung verursacht Kosten auf oft übersehene Weise. Besucher verlassen Seiten, die zu lange zum Laden brauchen, Mitarbeiter verlieren die Geduld mit trägen Dashboards, Suchmaschinen bevorzugen schnelle Websites und Server, die unnötig stark beansprucht werden, treiben die Hostingkosten in die Höhe. Laravel ist ein leistungsstarkes Framework und ermöglicht sehr schnelle Anwendungen, aber es macht nicht jede Anwendung automatisch schnell. Geschwindigkeit entsteht durch gute Entscheidungen, und einige wenige häufige Fehler sind die Hauptursache für Verlangsamungen.
Dieser Leitfaden zeigt vierzehn praktische Wege zur Verbesserung der Laravel-Performance – in der Reihenfolge, die sich in der Regel auszahlt: Zuerst messen, dann die Datenbank optimieren, anschließend Caching und Hintergrundverarbeitung hinzufügen und schließlich Framework und Infrastruktur optimieren. Er richtet sich an Entwickler und deren Manager. Jeder Abschnitt erklärt daher nicht nur die Hintergründe, sondern auch die konkreten Maßnahmen. Wenn Sie sich nicht sicher sind, ob Ihre Anwendung tieferliegende Probleme hat, ist unser Artikel über Anzeichen dafür, dass Ihre Laravel-Anwendung eine technische Überprüfung benötigt eine gute Ergänzung. Auf unserer Seite Laravel-Entwicklung wird außerdem erläutert, wie wir bei solchen Aufgaben vorgehen.
Schritt null: Messen, bevor Sie etwas ändern
Der häufigste Performance-Fehler besteht darin, das Falsche zu optimieren. Raten ist Zeitverschwendung und erhöht die Komplexität. Bevor Sie Codeänderungen vornehmen, finden Sie heraus, wo die Zeit tatsächlich verbraucht wird.
1. Finden Sie die langsamen Seiten und Abfragen
Nützliche Tools sind:
- Laravel Debugbar in der Entwicklungsumgebung, die Abfragen, Laufzeiten und Speicherverbrauch für jede Seite anzeigt.
- Laravel Telescope zur Untersuchung von Anfragen, Abfragen, Jobs und Ausnahmen in der Entwicklungs- und Staging-Umgebung.
- Das Protokoll für langsame Datenbankabfragen, das Abfragen über einen festgelegten Zeitraum aufzeichnet.
- Dienste zur Überwachung der Anwendungsleistung für die Produktionsumgebung, die die tatsächliche Benutzererfahrung zeigen.
- Browser-Entwicklertools, um die Serverzeit von der Ladezeit des Frontends zu trennen.
Beginnen Sie mit den Seiten, über die sich Benutzer tatsächlich beschweren oder die den meisten Traffic verzeichnen. Notieren Sie die Antwortzeit, die Anzahl der Abfragen und den verwendeten Speicher. Diese Werte bilden Ihre Basislinie, anhand derer Sie feststellen können, ob eine Änderung geholfen hat.
Oft ist das Ergebnis überraschend. Eine Seite, die aufgrund eines großen Bildes oder ressourcenintensiven JavaScripts langsam wirkt, profitiert nicht von einer Datenbankoptimierung, und eine Seite mit hunderten Abfragen wird durch einen schnelleren Server nicht verbessert.
Die Datenbank: Wo die meisten Probleme liegen
In typischen Geschäftsanwendungen ist die Datenbank die Hauptursache für Verzögerungen, meist aufgrund einiger weniger Muster.
2. Beheben Sie das N+1-Abfrageproblem
Dies ist das häufigste Performance-Problem in Laravel. Es tritt auf, wenn der Code eine Liste von Datensätzen lädt und dann für jeden Datensatz eine zusätzliche Abfrage ausführt, um zugehörige Daten abzurufen. Die Anzeige von 100 Bestellungen mit ihren Kunden kann unbemerkt zu 101 Abfragen führen.
Beheben Sie das Problem, indem Sie zugehörige Daten vorausschauend mit with() laden, sodass Laravel alle Daten mit wenigen statt Hunderten von Abfragen abruft. Sie können Laravel auch so konfigurieren, dass während der Entwicklung bei jedem Lazy Loading ein Fehler ausgegeben wird. Dadurch wird das Problem erkannt, bevor es die Benutzer erreicht.
3. Die richtigen Indizes hinzufügen
Ohne Index liest die Datenbank jede Zeile, um die angeforderten Daten zu finden. Bei kleinen Tabellen ist dies kaum spürbar, bei großen jedoch extrem langsam. Fügen Sie Indizes für Spalten hinzu, die Sie häufig filtern, sortieren oder verknüpfen, z. B. Fremdschlüssel, Statusfelder und Datumsangaben.
Verwenden Sie die Abfrageanalysetools der Datenbank, z. B. EXPLAIN, um zu überprüfen, ob eine Abfrage einen Index verwendet. Indizieren Sie nicht alles: Jeder Index verlangsamt Schreibvorgänge und belegt Speicherplatz. Fügen Sie Indizes daher nur dort hinzu, wo sie wirklich nötig sind.
4. Nur die benötigten Daten auswählen
Das Laden ganzer Datensätze mit allen Spalten, einschließlich großer Textfelder, wenn Sie nur Name und E-Mail-Adresse benötigen, verschwendet Speicher und Zeit. Wählen Sie stattdessen die benötigten Spalten aus. Bei großen Ergebnismengen sollten Daten in Blöcken verarbeitet oder Lazy Collections verwendet werden, damit die Anwendung nicht Hunderttausende Datensätze gleichzeitig in den Speicher lädt.
5. Paginierung und Limitierung
Laden Sie niemals eine unbegrenzte Liste. Verwenden Sie Paginierung für Listen, die Benutzern angezeigt werden, und Limitierungen für alle anderen Listen. Bei sehr großen Tabellen empfiehlt sich eine einfache Paginierung, die eine aufwendige Gesamtzählung vermeidet.
6. Datenbankoperationen ausführen
Sortieren, Filtern, Gruppieren und Summieren sind Aufgaben, die Datenbanken hervorragend erledigen. Diese Operationen in PHP nach dem Laden aller Datensätze durchzuführen, ist in der Regel deutlich langsamer. Verwenden Sie Abfragen, Aggregatfunktionen und gegebenenfalls Datenbankansichten oder Übersichtstabellen für umfangreiche Berichte.
Caching: Einmalige Berechnungen
7. Aufwändige Ergebnisse zwischenspeichern
Wenn eine Abfrage oder Berechnung aufwändig ist und sich das Ergebnis nicht bei jeder Anfrage ändert, z. B. eine Dashboard-Summe, eine Produktliste oder eine Konfigurationsabfrage, speichern Sie das Ergebnis kurzzeitig im Cache, anstatt es jedes Mal neu zu berechnen.
- Verwenden Sie in der Produktion einen schnellen Cache-Treiber wie Redis anstelle des Dateitreibers.
- Wählen Sie sinnvolle Ablaufzeiten und löschen Sie den Cache, wenn sich die zugrunde liegenden Daten ändern.
- Gehen Sie beim Caching sorgfältig vor. Veraltete Daten können schlimmer sein als langsame Daten, wenn es auf Genauigkeit ankommt, z. B. bei Lagerbeständen oder Salden.
8. HTTP- und Seiten-Caching verwenden, wo sinnvoll
Öffentliche Seiten, die sich selten ändern, können auf dem Webserver oder einem Content Delivery Network (CDN) zwischengespeichert werden, sodass die meisten Besucher PHP gar nicht erst erreichen. Setzen Sie die korrekten Cache-Header für statische Ressourcen, damit Browser Dateien wiederverwenden, anstatt sie erneut herunterzuladen.
Lassen Sie Benutzer nicht warten
9. Lagern Sie langsame Aufgaben in Warteschlangen aus
Alles, was länger als einen Moment dauert und nicht abgeschlossen sein muss, bevor der Benutzer eine Antwort erhält, gehört in einen Hintergrundprozess: E-Mails und Benachrichtigungen versenden, PDFs und Berichte generieren, Bilder und Dateien verarbeiten, langsame Drittanbieterdienste aufrufen und mit anderen Systemen synchronisieren.
Das Warteschlangensystem von Laravel macht dies einfach. Der Benutzer erhält eine sofortige Antwort, und die Worker bearbeiten die Aufgabe im Hintergrund und versuchen es bei Fehlern erneut. Verwenden Sie Redis oder ein zuverlässiges Warteschlangen-Backend und überwachen Sie die Warteschlangen, damit Fehler nicht unbemerkt bleiben. Laravel Horizon bietet ein Dashboard für Redis-Warteschlangen.
10. Planen Sie rechenintensive Aufgaben außerhalb der Spitzenzeiten.
Berichte, Bereinigungen, Importe und Synchronisierungen können über den Laravel-Scheduler in ruhigen Zeiten ausgeführt werden, anstatt während der Stoßzeiten mit den Benutzern zu konkurrieren.
Das Framework und der Server
11. Nutzen Sie die integrierten Optimierungsbefehle von Laravel in der Produktion.
Laravel kann verschiedene Dinge zwischenspeichern, um den Aufwand pro Anfrage zu reduzieren.
- Konfigurationscache (
php artisan config:cache) fasst die Konfiguration in einer einzigen Datei zusammen. - Routencache (
php artisan route:cache) beschleunigt die Routenregistrierung. - View-Cache (
php artisan view:cache) kompiliert Templates vor. - Ereigniscache berechnet die Ereigniserkennung vor.
php artisan optimizeführt die wichtigsten Caching-Schritte zusammen aus.
Führen Sie diese Befehle im Rahmen Ihrer Bereitstellung aus. Denken Sie daran, die Abhängigkeiten zu löschen oder neu zu erstellen, wenn sich die Konfiguration ändert. Installieren Sie außerdem Produktionsabhängigkeiten mit einem optimierten Autoloader (composer install --optimize-autoloader --no-dev).
12. PHP und Server optimieren
Grundlegende Infrastruktureinstellungen machen einen großen Unterschied.
- Verwenden Sie eine aktuelle PHP-Version. Jede neue Version bringt Leistungsverbesserungen.
- Aktivieren Sie OPcache, wodurch kompilierter PHP-Code im Speicher abgelegt wird. Dies ist einer der größten und einfachsten Optimierungsmöglichkeiten.
- Dimensionieren Sie PHP-Worker und Speicher entsprechend Ihrem Traffic und Ihrem Server.
- Verwenden Sie einen schnellen Datenbankserver mit ausreichend Speicher und konfigurieren Sie ihn sinnvoll.
- Platzieren Sie die Datenbank in der Nähe der Anwendung, um Netzwerkverzögerungen zu reduzieren.
- Erwägen Sie Laravel Octane, das die Anwendung zwischen Anfragen mithilfe von Swoole oder RoadRunner im Speicher hält. Es kann den Durchsatz für geeignete Anwendungen deutlich erhöhen, erfordert jedoch Sorgfalt im Umgang mit Zuständen, die zwischen Anfragen erhalten bleiben, und ist daher keine Standardwahl.
13. Frontend und Assets optimieren
Die Servergeschwindigkeit ist nur ein Teil dessen, was Benutzer empfinden.
- Bilder komprimieren und skalieren und moderne Formate wie WebP verwenden.
- CSS und JavaScript mit Ihrem Build-Tool minimieren und bündeln und nur das laden, was jede Seite benötigt.
- Nicht kritische Skripte verzögern und Bilder unterhalb des sichtbaren Bereichs nachladen.
- Assets über ein CDN in der Nähe Ihrer Benutzer bereitstellen.
- Aufwändige Drittanbieter-Skripte vermeiden, die das Rendering verzögern.
- Komprimierung wie gzip oder Brotli auf dem Server aktivieren.
Frontend-Optimierung ist oft der schnellste Weg, die gefühlte Geschwindigkeit einer Seite zu verbessern, und wirkt sich auch auf das Suchmaschinenranking aus.
14. Abhängigkeiten und Code schlank halten
- Nicht verwendete Pakete entfernen. Jedes Paket erhöht die Ladezeit und Wartung.
- Vermeiden Sie rechenintensive Aufgaben in Service Providern, Middleware oder globalen Scopes, die bei jeder Anfrage ausgeführt werden.
- Seien Sie vorsichtig mit großen Datenmengen im Speicher; verwenden Sie Datenbankoperationen oder Lazy Collections.
- Führen Sie regelmäßig Profiling durch. Die Performance verschlechtert sich mit dem Hinzufügen von Funktionen. Überprüfen Sie sie daher im Rahmen der laufenden Entwicklung und nicht erst, wenn sich Benutzer beschweren.
Eine Kurzübersicht
| Symptom | Wahrscheinliche Ursache | Erste Lösung |
|---|---|---|
| Seite führt Hunderte von Abfragen aus | N+1-Problem | Eager Loading mit with() |
| Eine Abfrage dauert Sekunden | Fehlender Index oder rechenintensive Abfrage | EXPLAIN, Index hinzufügen, Abfrage umschreiben |
| Dashboard ist langsam | Aufwändige wiederholte Berechnungen | Ergebnisse zwischenspeichern oder Zusammenfassungstabellen verwenden |
| Formularabsendung hängt | Langsame Verarbeitung in der Anfrage | In einen Warteschlangenjob verschieben |
| Jede Anfrage ist etwas langsam | Framework-Overhead | Konfigurations-, Routen- und Ansichtscache, OPcache |
| Speicherfehler bei großen Listen | Zu viele Daten gleichzeitig laden | Chunking, Lazy Collections, Paginierung |
| Schneller Server, langsame Seite | Lastreiches Frontend | Bilder komprimieren, Skripte reduzieren, CDN verwenden |
| Langsam bei Lastspitzen | Zu wenige Worker, kein Caching | Caching, mehr Worker, Octane in Betracht ziehen |
Häufige Fehler
- Optimieren ohne Messung. Sie beheben möglicherweise das Falsche.
- Alles cachen. Veraltete oder inkonsistente Daten verursachen schwer auffindbare Fehler.
- Blindes Hinzufügen von Indizes, was Schreibvorgänge verlangsamt, ohne Lesevorgänge zu verbessern.
- Das N+1-Problem ignorieren, da es bei kleinen Testdaten unsichtbar ist.
- Nur mit winzigen Datensätzen testen. Leistungsprobleme treten erst bei realistischer Datenmenge auf.
- Produktionsumgebung im Debug-Modus oder mit Entwicklungseinstellungen betreiben.
- Dateicache und Synchronisierungswarteschlange im Produktivbetrieb nutzen.
- Performance als einmaliges Projekt und nicht als Gewohnheit betrachten.
- Frontend vernachlässigen.
- Hardware skalieren, bevor der Code optimiert wird. Ein größerer Server kaschiert ein Problem und verursacht höhere Kosten.
Performance und das Gesamtbild
Geschwindigkeit ist nicht nur eine technische Frage. Sie beeinflusst Konversion, Sichtbarkeit in Suchmaschinen, Hostingkosten und Mitarbeiterproduktivität. Außerdem steht sie in Zusammenhang mit Wartbarkeit: Sauberer, getesteter Code mit sinnvoller Struktur lässt sich leichter und sicherer optimieren. Das ist einer der Gründe, warum wir Investitionen in Qualität von Anfang an empfehlen, wie in Softwarewartungskosten beschrieben, und die Wahl der richtigen Technologie für die jeweilige Aufgabe, die wir in Laravel vs. Node.js erörtern.
Wenn Sie eine größere Anwendung planen, sollte die Performance von Beginn an Teil des Designs sein: Berücksichtigen Sie Datenvolumen, erwarteten Traffic und was zwischengespeichert oder in die Warteschlange gestellt werden kann. Unsere Kostenleitfäden für Webanwendungen und Kostenleitfaden für Laravel zeigen, wie sich Skalierung und Performance-Anforderungen auf das Budget auswirken.
Eine einfache Performance-Routine
- Setzen Sie ein Ziel fest, z. B. Seitenladezeiten unter zwei Sekunden für die meisten Benutzer.
- Messen Sie wichtige Seiten und notieren Sie den Ausgangswert.
- Beheben Sie zuerst das größte Problem, in der Regel ein Datenbankproblem.
- Führen Sie erneute Messungen durch, um die Verbesserung zu bestätigen.
- Fügen Sie Caching und Queues hinzu, um wiederholte oder langsame Operationen zu vermeiden.
- Wenden Sie Produktionsoptimierungen in Ihren Deployment-Prozess ein.
- Überwachen Sie die Performance kontinuierlich und überprüfen Sie sie nach jedem größeren Release.
Abschließende Gedanken
Die meisten Performance-Probleme von Laravel lassen sich auf wenige Ursachen zurückführen: zu viele Abfragen, fehlende Indizes, langsame Operationen während der Wartezeit des Benutzers und fehlende Produktionsoptimierungen. Messen und beheben Sie zuerst das Datenbankproblem, cachen und queuen Sie, was möglich ist, optimieren Sie Framework und Server und halten Sie das Frontend schlank. Kleine, gut gewählte Änderungen beschleunigen Anwendungen regelmäßig um ein Vielfaches, ohne dass eine Neuentwicklung nötig ist.
Wenn Ihre Anwendung langsam ist und Sie die Ursache nicht kennen, kontaktieren Sie uns. Wir können das überprüfen, die tatsächlichen Engpässe ermitteln und einen priorisierten Plan vorschlagen, oder, falls Sie regelmäßig zusätzliche Unterstützung benötigen, können Sie Laravel-Entwickler einstellen, die mit Ihrem Team zusammenarbeiten.