Laravel Geschwindigkeits- und Leistungsoptimierung 101 – Die Richtlinie

Geschwindigkeit-1249610_1920Ich arbeite an einer ziemlich umfangreichen Laravel-Site mit vielen Anfragen und vielen Eloquent/SQL-Aufrufen. Trotz des VPS mit viel Arbeitsspeicher und hoher CPU-Leistung hatte ich das Gefühl, dass es Raum für Leistungsverbesserungen gibt. Deshalb möchte ich einige Verbesserungen zur Beschleunigung von Laravel aufschreiben:

1. Verwenden Sie Datenbank oder Redis für Cache und Sitzungen

Wenn Sie zu config/cache.php und config/session.php navigieren, sehen Sie, dass die Standarddateien CACHE_DRIVER und SESSION_DRIVER = sind. Wenn Sie Redis installiert haben, versuchen Sie einfach, es als Cache- und Sitzungstreiber festzulegen. Überprüfen Sie, ob Redis installiert ist, indem Sie Folgendes ausführen:

redis-cli

Wenn es installiert ist, versuchen Sie, die Treiber in Ihrer .env-Datei zu definieren:

CACHE_DRIVER=redis SESSION_DRIVER=redis

2. Verwenden Sie mehrere vorgefertigte Handwerkerbefehle

Es gibt verschiedene Handwerkerbefehle die dazu dienen, verschiedene Teile von Laravel zwischenzuspeichern. Sie können sie im Bereitstellungsprozess von Laravel Forge oder Envoyer konfigurieren:

php artisan route:cache php artisan config:cache php artisan optimieren --force

 

Leitfaden zur Verwendung von Entwicklertools

Führen Sie einen Lauf unter https://developers.google.com/web/fundamentals/performance/ durch und optimieren Sie mehrere Schritte:

3. Optimieren Sie Bilder wie PNGs und JPEGs

Bilder enthalten manchmal nutzlose Zusatzdaten, die verlustfrei optimiert werden können. Dafür können Sie die Pakete OptiPNG und JPEGOptim. Installieren Sie OptiPNG in Ubuntu:

sudo apt-get update sudo apt-get installiere optipng

Und installieren Sie auch JPEGOptim:

sudo apt-get installiere jpegoptim

Navigieren Sie nun zu dem Ordner, dessen Bilder Sie optimieren möchten. Für optipng führen Sie Folgendes aus:

optipng *

Für jpegoptim führen Sie Folgendes aus:

für i in *.jpg; führe jpegoptim --all-progressive "$i" aus; fertig

Beachten Sie, dass auch die Unterverzeichnisse optimiert werden können

4. Verwenden Sie HTTP2 anstelle von HTTP 1.1, wenn Sie ein SSL-Zertifikat aktiviert haben

Die folgende Anleitung hilft Ihnen dabei der Prozess der Aktualisierung auf HTTP2 in Nginx.

Beachten Sie, dass Sie ein SSL-Zertifikat benötigen. Google PageSpeed hat eine Servergeschwindigkeitsänderung von 0,52 s (ohne HTTP2, mit SSL) auf 0,35 s (mit HTTP2) bewirkt.

Ergebnis: Ca. 30% Geschwindigkeitssteigerung

5. Cache-Antwort in Redis oder Datei

Manchmal ist es unnötig, dass die Seite mehrmals aus einer Datenbank aufgerufen wird. Allein das Zwischenspeichern der Seite reduziert die Last erheblich. Das ist genau die gleiche Idee wie bei Laravel Response Cache-Plugin. Die Installationsanweisungen sind ziemlich gut. In meinem Fall hat es eine drastische Leistungsverbesserung gebracht.

Ergebnis: ca. 200 ms Geschwindigkeitssteigerung in meinem Fall

6. Optimieren Sie InnoDB innodb_buffer_pool_size

Ich bin mir nicht sicher, warum, aber aus irgendeinem Grund hat InnoDB eine wirklich kleine innodb_buffer_pool_size, wenn Sie Ihren ersten Laravel Forge-Server bereitstellen. In meinem Standardfall betrug die innodb_buffer_pool_size 8 MB, während einige Blogs schätzen, dass Sie bis zu 80% Ihres RAM für innodb_buffer_pool_size. Bearbeiten Sie also die Datei my.conf:

sudo nano /etc/mysql/my.cnf

Und fügen Sie zum Beispiel hinzu:

innodb_buffer_pool_size = 1G

Ergebnis: Mehrfach schnellere Abfragen

7. Reduzieren Sie die Last durch Hinzufügen von Swap

Mein Server hatte regelmäßig Probleme mit vollem Redis-Speicher und hoher Auslastung. Dies wurde gelöst, indem Ubuntu etwas Swap hinzugefügt wurde. Wie von DigitalOcean beschrieben:

Eine der einfachsten Möglichkeiten, die Reaktionsfähigkeit Ihres Servers zu verbessern und sich vor Speicherausfällen in Ihren Anwendungen zu schützen, besteht darin, Swap-Speicher hinzuzufügen. Swap ist ein Bereich auf einer Festplatte, der als Ort vorgesehen ist, an dem das Betriebssystem Daten vorübergehend speichern kann, die es nicht mehr im RAM halten kann.

Lesen Sie mehr über das Hinzufügen von Swap auf der DigitalOcean-Website.

Ergebnis: Reduzierung der Belastung bei der Eingabe des Befehls „top“

8. Eager Loading statt Lazy Loading verwenden

Bei der Verwendung von Laravel Eloquent-Modellen mit Relationen ist es verlockend, „Lazy Loading“ zu verwenden. Auf diese Weise können relationale Modelle in eine Schleife gebracht werden. Beispiel:

Kommentare->Name; }

Auf diese Weise werden die Kommentare für jeden Blog in separaten Abfragen geladen. Bei Verwendung von Eager Loading werden die Kommentare in EINER IN-Abfrage geladen:

get(); foreach ($blogs als $blog) { echo $blog->Kommentare->Name; }

Lesen Sie mehr über Eager Loading auf Laravels Dokumentation.

Wie finde ich Abfragen, die möglicherweise optimiert werden müssen?

Sie wissen nicht, wie Sie Abfragen finden, die möglicherweise optimiert werden müssen? Beispielsweise Abfragen, die Eager Loading statt Lazy Loading benötigen? Am einfachsten ist es, diese zu installieren und zu aktivieren. Laravel Debugleiste auf Ihrem Entwicklungsserver. Mit dieser Symbolleiste können Sie die Abfragen pro Seite anzeigen. Wenn Sie viele Abfragen sehen, die mit einem einfachen Join oder einer In-Abfrage hätten vereinfacht werden können, wissen Sie, dass Sie dieses Skript mit Eager Loading optimieren müssen.

Ergebnis: Jede Abfrage wird gespeichert, einige Millisekunden pro Abfrage

Diese Liste ist noch in Arbeit, aber die obigen Tipps haben mir eine Geschwindigkeitsverbesserung von MEHR ALS 1 SEKUNDE gebracht. Wenn Sie Tipps haben, lassen Sie es mich in den Kommentaren wissen!

Teilen Sie auch Ihre Geschwindigkeitsverbesserungen 🙂

5-Gedanken zu „Laravel Speed and Performance Optimization 101 – The Guideline“

  1. Danke, es ist sehr informativ und hilfreich.

    Da habe ich einen coolen Tippfehler gefunden:
    R7. erziehen ….
    Ich denke, es sollte so sein
    7. Reduzieren Sie ….

Einen Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

de_DEDeutsch
Nach oben blättern