Wie optimiere ich die PHP Laravel-Webanwendung für hohe Leistung?

Laravel ist vieles. Aber schnell ist keiner von ihnen. Lernen wir einige Tricks des Handels, um es schneller zu machen!


Kein PHP-Entwickler bleibt davon unberührt Laravel heutzutage. Sie sind entweder Junior- oder Mid-Level-Entwickler, die die schnelle Entwicklung von Laravel lieben, oder sie sind Senior-Entwickler, die aufgrund des Marktdrucks gezwungen sind, Laravel zu lernen.

In beiden Fällen ist nicht zu leugnen, dass Laravel das PHP-Ökosystem wiederbelebt hat (ich hätte die PHP-Welt sicherlich schon vor langer Zeit verlassen, wenn Laravel nicht dort gewesen wäre)..

Ein Ausschnitt aus (etwas gerechtfertigtem) Selbstlob von Laravel

Da sich Laravel jedoch nach hinten beugt, um Ihnen die Arbeit zu erleichtern, bedeutet dies, dass darunter jede Menge Arbeit geleistet wird, um sicherzustellen, dass Sie ein angenehmes Leben als Entwickler haben. Alle „magischen“ Funktionen von Laravel, die scheinbar nur funktionieren, verfügen über mehrere Codeebenen, die bei jeder Ausführung eines Features aktualisiert werden müssen. Sogar eine einfache Ausnahme zeigt, wie tief das Kaninchenloch ist (beachten Sie, wo der Fehler beginnt, bis hinunter zum Hauptkern):

Für einen Kompilierungsfehler in einer der Ansichten müssen 18 Funktionsaufrufe verfolgt werden. Ich persönlich bin auf 40 gestoßen, und es könnte leicht mehr geben, wenn Sie andere Bibliotheken und Plugins verwenden.

Der Punkt ist, dass diese Ebenen standardmäßig Laravel langsam machen.

Wie langsam ist Laravel?

Ehrlich gesagt ist es aus mehreren Gründen unmöglich, diese Frage zu beantworten.

Zuerst, Es gibt keinen akzeptierten, objektiven und vernünftigen Standard zur Messung der Geschwindigkeit von Web-Apps. Schneller oder langsamer als was? Unter welchen Bedingungen?

Zweite, Eine Web-App hängt von so vielen Dingen ab (Datenbank, Dateisystem, Netzwerk, Cache usw.), dass es einfach albern ist, über Geschwindigkeit zu sprechen. Eine sehr schnelle Web-App mit einer sehr langsamen Datenbank ist eine sehr langsame Web-App. ��

Aber genau diese Unsicherheit ist der Grund, warum Benchmarks beliebt sind. Auch wenn sie nichts bedeuten (siehe diese und diese) bieten sie einen Bezugsrahmen und helfen uns, nicht verrückt zu werden. Lassen Sie uns daher mit mehreren Prisen Salz eine falsche, grobe Vorstellung von der Geschwindigkeit zwischen PHP-Frameworks bekommen.

An diesem ziemlich respektablen GitHub vorbei Quelle, So richten sich die PHP-Frameworks im Vergleich aus:

Sie werden Laravel hier vielleicht nicht einmal bemerken (selbst wenn Sie wirklich hart blinzeln), es sei denn, Sie werfen Ihren Fall bis zum Ende des Schwanzes. Ja, liebe Freunde, Laravel kommt zuletzt! Zugegeben, die meisten dieser „Frameworks“ sind nicht sehr praktisch oder sogar nützlich, aber es zeigt uns, wie träge Laravel im Vergleich zu anderen populäreren ist.

Normalerweise tritt diese “Langsamkeit” in Anwendungen nicht auf, da unsere alltäglichen Webanwendungen selten hohe Zahlen erreichen. Aber sobald sie dies tun (z. B. ab 200-500 Parallelität), beginnen die Server zu ersticken und zu sterben. Es ist die Zeit, in der noch mehr Hardware auf das Problem geworfen wird und die Infrastrukturrechnungen so schnell steigen, dass Ihre hohen Ideale für Cloud Computing zusammenbrechen.

Aber hey, sei fröhlich! In diesem Artikel geht es nicht darum, was nicht getan werden kann, sondern darum, was getan werden kann. ��

Die gute Nachricht ist, dass Sie viel tun können, um Ihre Laravel-App schneller zu machen. Mehrmals schnell. Ja, kein Scherz. Sie können dieselbe Codebasis ballistisch gestalten und jeden Monat mehrere hundert Dollar an Infrastruktur- / Hosting-Rechnungen sparen. Wie? Lasst uns anfangen.

Vier Arten von Optimierungen

Meiner Meinung nach kann die Optimierung auf vier verschiedenen Ebenen durchgeführt werden (dh bei PHP-Anwendungen):

  1. Sprachniveau: Dies bedeutet, dass Sie eine schnellere Version der Sprache verwenden und bestimmte Funktionen / Codierungsstile in der Sprache vermeiden, die Ihren Code verlangsamt.
  2. Framework-Ebene: Dies sind die Dinge, die wir in diesem Artikel behandeln werden.
  3. Infrastrukturebene: Optimieren Ihres PHP-Prozessmanagers, Webservers, Ihrer Datenbank usw..
  4. Hardware-Level: Wechsel zu einem besseren, schnelleren und leistungsfähigeren Hardware-Hosting-Anbieter.

Alle diese Arten von Optimierungen haben ihren Platz (zum Beispiel ist die PHP-Fpm-Optimierung ziemlich kritisch und leistungsfähig). Der Schwerpunkt dieses Artikels liegt jedoch auf Optimierungen vom Typ 2: solchen, die sich auf das Framework beziehen.

Übrigens gibt es keine Gründe für die Nummerierung und es ist kein akzeptierter Standard. Ich habe das gerade erfunden. Bitte zitieren Sie mich nie und sagen Sie: “Wir brauchen eine Typ-3-Optimierung auf unserem Server”, oder Ihr Teamleiter wird Sie töten, mich finden und mich dann auch töten. ��

Und jetzt kommen wir endlich im gelobten Land an.

Beachten Sie n + 1 Datenbankabfragen

Das n + 1-Abfrageproblem tritt häufig auf, wenn ORMs verwendet werden. Laravel hat sein leistungsstarkes ORM namens Eloquent, das so schön und praktisch ist, dass wir oft vergessen, uns anzusehen, was los ist.

Stellen Sie sich ein sehr häufiges Szenario vor: Anzeigen der Liste aller Bestellungen, die von einer bestimmten Kundenliste aufgegeben wurden. Dies ist in E-Commerce-Systemen und allen Berichtsschnittstellen im Allgemeinen häufig der Fall, in denen alle Entitäten angezeigt werden müssen, die sich auf einige Entitäten beziehen.

In Laravel können wir uns eine Controller-Funktion vorstellen, die diese Aufgabe wie folgt erfüllt:

Klasse OrdersController erweitert Controller
{
// // …

öffentliche Funktion getAllByCustomers (Request $ request, Array $ ids) {
$ customers = Customer :: findMany ($ ids);
$ orders = collect (); // neue Kollektion

foreach ($ Kunden als $ Kunde) {
$ Bestellungen = $ Bestellungen->zusammenführen ($ Kunde->Aufträge);
}}

Rückgabeansicht (‘admin.reports.orders’, [‘orders’ => $ Bestellungen]);
}}
}}

Süss! Und was noch wichtiger ist, elegant, schön. ����

Leider ist es eine katastrophale Art, Code in Laravel zu schreiben.

Hier ist der Grund.

Wenn wir den ORM bitten, nach den angegebenen Kunden zu suchen, wird eine SQL-Abfrage wie diese generiert:

SELECT * FROM Kunden, bei denen ID IN (22, 45, 34, …);

Welches ist genau wie erwartet. Infolgedessen werden alle zurückgegebenen Zeilen in der Sammlung $ customers in der Controller-Funktion gespeichert.

Jetzt durchlaufen wir jeden Kunden einzeln und erhalten seine Bestellungen. Dies führt die folgende Abfrage aus . . .

SELECT * FROM Bestellungen WHERE customer_id = 22;

. . . so oft wie es Kunden gibt.

Mit anderen Worten, wenn wir die Bestelldaten für 1000 Kunden abrufen müssen, beträgt die Gesamtzahl der ausgeführten Datenbankabfragen 1 (zum Abrufen aller Kundendaten) + 1000 (zum Abrufen von Bestelldaten für jeden Kunden) = 1001. Dies Hier kommt der Name n + 1 her.

Können wir es besser machen? Bestimmt! Durch die Verwendung des so genannten eifrigen Ladens können wir das ORM zwingen, einen JOIN durchzuführen und alle erforderlichen Daten in einer einzigen Abfrage zurückzugeben! So was:

$ orders = Customer :: findMany ($ ids)->mit (‘Bestellungen’)->erhalten();

Die resultierende Datenstruktur ist zwar verschachtelt, aber die Auftragsdaten können leicht extrahiert werden. Die resultierende Einzelabfrage sieht in diesem Fall ungefähr so ​​aus:

SELECT * FROM Kunden INNER JOIN Bestellungen ON customers.id = orders.customer_id WHERE customers.id IN (22, 45, …);

Eine einzelne Abfrage ist natürlich besser als tausend zusätzliche Abfragen. Stellen Sie sich vor, was passieren würde, wenn 10.000 Kunden bearbeitet werden müssten! Oder Gott bewahre, wenn wir auch die in jeder Bestellung enthaltenen Artikel anzeigen wollten! Denken Sie daran, dass der Name der Technik eifrig geladen wird und es fast immer eine gute Idee ist.

Cache die Konfiguration!

Einer der Gründe für die Flexibilität von Laravel sind die unzähligen Konfigurationsdateien, die Teil des Frameworks sind. Möchten Sie ändern, wie / wo die Bilder gespeichert werden??

Nun, ändern Sie einfach die Datei config / filesystems.php (zumindest zum Zeitpunkt des Schreibens). Möchten Sie mit mehreren Warteschlangentreibern arbeiten? Fühlen Sie sich frei, sie in config / queue.php zu beschreiben. Ich habe gerade gezählt und festgestellt, dass es 13 Konfigurationsdateien für verschiedene Aspekte des Frameworks gibt, um sicherzustellen, dass Sie nicht enttäuscht werden, egal was Sie ändern möchten.

Angesichts der Natur von PHP wacht Laravel jedes Mal auf, wenn eine neue Webanforderung eingeht, startet alles und analysiert alle diese Konfigurationsdateien, um herauszufinden, wie diesmal etwas anders gemacht werden kann. Nur dass es dumm ist, wenn sich in den letzten Tagen nichts geändert hat! Das Neuerstellen der Konfiguration bei jeder Anforderung ist eine Verschwendung, die vermieden werden kann (tatsächlich muss), und der Ausweg ist ein einfacher Befehl, den Laravel anbietet:

PHP Artisan Config: Cache

Dadurch werden alle verfügbaren Konfigurationsdateien in einer einzigen zusammengefasst, und der Cache kann irgendwo schnell abgerufen werden. Wenn das nächste Mal eine Webanforderung eingeht, liest Laravel einfach diese einzelne Datei und legt los.

Das heißt, Konfigurations-Caching ist eine äußerst heikle Operation, die Ihnen ins Gesicht sprengen kann. Das größte Problem ist, dass nach dem Ausgeben dieses Befehls die Funktion env () von überall aufgerufen wird, außer dass die Konfigurationsdateien null zurückgeben!

Es macht Sinn, wenn Sie darüber nachdenken. Wenn Sie das Konfigurations-Caching verwenden, sagen Sie dem Framework: “Weißt du was? Ich glaube, ich habe die Dinge gut eingerichtet und bin zu 100% sicher, dass ich nicht möchte, dass sie sich ändern.” Mit anderen Worten, Sie erwarten, dass die Umgebung statisch bleibt, wofür .env-Dateien gedacht sind.

Nach alledem sind hier einige eiserne, heilige, unzerbrechliche Regeln für das Caching von Konfigurationen:

  1. Tun Sie es nur auf einem Produktionssystem.
  2. Tun Sie dies nur, wenn Sie wirklich sicher sind, dass Sie die Konfiguration einfrieren möchten.
  3. Falls etwas schief geht, machen Sie die Einstellung mit dem PHP Artisan Cache rückgängig: clear
  4. Betet, dass der Schaden, der dem Unternehmen zugefügt wurde, nicht signifikant war!

Reduzieren Sie automatisch geladene Dienste

Um hilfreich zu sein, lädt Laravel beim Aufwachen eine Menge Dienste. Diese sind in der Datei config / app.php als Teil des Array-Schlüssels ‘provider’ verfügbar. Schauen wir uns an, was ich in meinem Fall habe:

/ *
|————————————————————————–
| Autoloaded Service Providers
|————————————————————————–
|
| Die hier aufgeführten Dienstleister werden automatisch auf die geladen
| Anfrage an Ihre Bewerbung. Fühlen Sie sich frei, Ihre eigenen Dienste hinzuzufügen
| Dieses Array gewährt Ihren Anwendungen erweiterte Funktionen.
|
* /

‘Anbieter’ => [

/ *
* Laravel Framework-Dienstleister…
* /
Illuminate \ Auth \ AuthServiceProvider :: class,
Illuminate \ Broadcasting \ BroadcastServiceProvider :: class,
Beleuchten Sie \ Bus \ BusServiceProvider :: class,
Illuminate \ Cache \ CacheServiceProvider :: class,
Illuminate \ Foundation \ Providers \ ConsoleSupportServiceProvider :: class,
Illuminate \ Cookie \ CookieServiceProvider :: class,
Illuminate \ Database \ DatabaseServiceProvider :: class,
Illuminate \ Encryption \ EncryptionServiceProvider :: class,
Illuminate \ Filesystem \ FilesystemServiceProvider :: class,
Illuminate \ Foundation \ Providers \ FoundationServiceProvider :: class,
Illuminate \ Hashing \ HashServiceProvider :: class,
Illuminate \ Mail \ MailServiceProvider :: class,
Illuminate \ Notifications \ NotificationServiceProvider :: class,
Illuminate \ Pagination \ PaginationServiceProvider :: class,
Illuminate \ Pipeline \ PipelineServiceProvider :: class,
Illuminate \ Queue \ QueueServiceProvider :: class,
Illuminate \ Redis \ RedisServiceProvider :: class,
Beleuchten Sie \ Auth \ Passwords \ PasswordResetServiceProvider :: class,
Illuminate \ Session \ SessionServiceProvider :: class,
Illuminate \ Translation \ TranslationServiceProvider :: class,
Illuminate \ Validation \ ValidationServiceProvider :: class,
Illuminate \ View \ ViewServiceProvider :: class,

/ *
* Paketdienstleister…
* /

/ *
* Anwendungsdienstleister…
* /
App \ Providers \ AppServiceProvider :: class,
App \ Providers \ AuthServiceProvider :: class,
// App \ Providers \ BroadcastServiceProvider :: class,
App \ Providers \ EventServiceProvider :: class,
App \ Providers \ RouteServiceProvider :: class,

]],

Ich habe noch einmal gezählt und es sind 27 Dienste aufgelistet! Jetzt brauchen Sie vielleicht alle, aber das ist unwahrscheinlich.

Zum Beispiel erstelle ich gerade eine REST-API, was bedeutet, dass ich den Sitzungsdienstanbieter, den Ansichtsdienstanbieter usw. nicht benötige. Und da ich einige Dinge auf meine Weise mache und die Framework-Standardeinstellungen nicht befolge Ich kann auch den Auth-Dienstanbieter, den Paginierungsdienstanbieter, den Übersetzungsdienstanbieter usw. deaktivieren. Insgesamt ist fast die Hälfte davon für meinen Anwendungsfall nicht erforderlich.

Schauen Sie sich Ihre Bewerbung genau an. Benötigt es all diese Dienstleister? Aber um Gottes willen, kommentieren Sie diese Dienstleistungen bitte nicht blind aus und gehen Sie zur Produktion! Führen Sie alle Tests aus, überprüfen Sie die Dinge manuell auf Entwicklungs- und Staging-Maschinen und seien Sie sehr, sehr paranoid, bevor Sie den Abzug betätigen. ��

Seien Sie weise mit Middleware-Stacks

Wenn Sie eine benutzerdefinierte Verarbeitung der eingehenden Webanforderung benötigen, ist das Erstellen einer neuen Middleware die Antwort. Jetzt ist es verlockend, app / Http / Kernel.php zu öffnen und die Middleware in den Web- oder API-Stack zu stecken. Auf diese Weise wird es in der gesamten App verfügbar und wenn es nicht aufdringlich ist (z. B. Protokollierung oder Benachrichtigung).

Wenn die App wächst, kann diese Sammlung globaler Middleware jedoch zu einer stillen Belastung für die App werden, wenn alle (oder die Mehrheit) davon in jeder Anfrage vorhanden sind, auch wenn es keinen geschäftlichen Grund dafür gibt.

Mit anderen Worten, achten Sie darauf, wo Sie eine neue Middleware hinzufügen / anwenden. Es kann bequemer sein, etwas global hinzuzufügen, aber der Leistungsverlust ist auf lange Sicht sehr hoch. Ich kenne die Schmerzen, die Sie erleiden müssten, wenn Sie bei jeder neuen Änderung selektiv Middleware anwenden würden, aber ich würde diese Schmerzen gerne annehmen und empfehlen!

Vermeiden Sie das ORM (manchmal)

Während Eloquent viele Aspekte der DB-Interaktion angenehm macht, geht dies zu Lasten der Geschwindigkeit. Als Mapper muss der ORM nicht nur Datensätze aus der Datenbank abrufen, sondern auch die Modellobjekte instanziieren und sie mit Spaltendaten hydratisieren (ausfüllen).

Wenn Sie also ein einfaches $ users = User :: all () ausführen und beispielsweise 10.000 Benutzer vorhanden sind, ruft das Framework 10.000 Zeilen aus der Datenbank ab und führt intern 10.000 neue User () aus und füllt deren Eigenschaften mit den relevanten Daten . Dies ist eine enorme Menge an Arbeit, die hinter den Kulissen geleistet wird. Wenn die Datenbank, in der sich Ihre Anwendung befindet, zu einem Engpass wird, ist es manchmal eine gute Idee, das ORM zu umgehen.

Dies gilt insbesondere für komplexe SQL-Abfragen, bei denen Sie viele Rahmen überspringen und Schließungen nach Schließungen schreiben müssen, um dennoch eine effiziente Abfrage zu erhalten. In solchen Fällen wird es bevorzugt, DB :: raw () auszuführen und die Abfrage von Hand zu schreiben.

Vorbeigehen diese Leistungsstudie, auch für einfache Beilagen Eloquent ist mit steigender Anzahl von Datensätzen viel langsamer:

Verwenden Sie so viel Caching wie möglich

Eines der bestgehüteten Geheimnisse der Webanwendungsoptimierung ist das Caching.

Für Uneingeweihte bedeutet Caching, teure Ergebnisse (teuer in Bezug auf CPU- und Speicherauslastung) vorab zu berechnen und zu speichern und sie einfach zurückzugeben, wenn dieselbe Abfrage wiederholt wird.

In einem E-Commerce-Geschäft kann es beispielsweise vorkommen, dass die 2 Millionen Produkte vorhanden sind. Meistens interessieren sich die Menschen für Produkte, die innerhalb einer bestimmten Preisspanne und für eine bestimmte Altersgruppe frisch gelagert sind. Das Abfragen der Datenbank nach diesen Informationen ist verschwenderisch. Da sich die Abfrage nicht häufig ändert, ist es besser, diese Ergebnisse an einem Ort zu speichern, auf den wir schnell zugreifen können.

Laravel verfügt über eine integrierte Unterstützung für verschiedene Arten von Caching. Zusätzlich zur Verwendung eines Caching-Treibers und zum Aufbau des Caching-Systems von Grund auf möchten Sie möglicherweise einige Laravel-Pakete verwenden, die dies erleichtern Modell-Caching, Abfrage-Caching, usw.

Beachten Sie jedoch, dass vorgefertigte Caching-Pakete über einen bestimmten vereinfachten Anwendungsfall hinaus mehr Probleme verursachen als lösen können.

Bevorzugen Sie das In-Memory-Caching

Wenn Sie etwas in Laravel zwischenspeichern, haben Sie mehrere Möglichkeiten, die resultierende Berechnung zu speichern, die zwischengespeichert werden muss. Diese Optionen werden auch als bezeichnet Cache-Treiber. Obwohl es möglich und durchaus sinnvoll ist, das Dateisystem zum Speichern von Cache-Ergebnissen zu verwenden, ist es nicht wirklich das, was Caching sein soll.

Idealerweise möchten Sie einen speicherinternen Cache (der vollständig im RAM lebt) wie Redis, Memcached, MongoDB usw. verwenden, damit das Caching bei höheren Lasten eine wichtige Verwendung darstellt, anstatt selbst zum Engpass zu werden.

Nun könnte man denken, dass eine SSD-Festplatte fast mit der Verwendung eines RAM-Sticks identisch ist, aber nicht einmal in der Nähe. Auch informell Benchmarks zeigen, dass RAM die SSD 10-20 Mal übertrifft, wenn es um Geschwindigkeit geht.

Mein Lieblingssystem beim Caching ist Redis. Es ist lächerlich schnell (100.000 Lesevorgänge pro Sekunde sind üblich) und kann für sehr große Cache-Systeme zu einem entwickelt werden Cluster leicht.

Zwischenspeichern Sie die Routen

Genau wie bei der Anwendungskonfiguration ändern sich die Routen im Laufe der Zeit nicht wesentlich und sind ein idealer Kandidat für das Caching. Dies gilt insbesondere dann, wenn Sie große Dateien wie mich nicht ausstehen und Ihre web.php und api.php am Ende auf mehrere Dateien aufteilen können. Ein einziger Laravel-Befehl packt alle verfügbaren Routen zusammen und hält sie für den zukünftigen Zugriff bereit:

PHP Artisan Route: Cache

Und wenn Sie am Ende Routen hinzufügen oder ändern, tun Sie einfach Folgendes:

PHP Artisan Route: klar

Bildoptimierung und CDN

Bilder sind das Herz und die Seele der meisten Webanwendungen. Zufälligerweise sind sie auch die größten Konsumenten von Bandbreite und einer der Hauptgründe für langsame Apps / Websites. Wenn Sie die hochgeladenen Bilder einfach naiv auf dem Server speichern und in HTTP-Antworten zurücksenden, entgeht Ihnen eine große Optimierungsmöglichkeit.

Meine erste Empfehlung lautet, Bilder nicht lokal zu speichern. Es besteht das Problem des Datenverlusts. Je nachdem, in welcher geografischen Region sich Ihr Kunde befindet, kann die Datenübertragung schmerzhaft langsam sein.

Entscheiden Sie sich stattdessen für eine Lösung wie Cloudinary Dadurch werden Bilder automatisch geändert und optimiert.

Wenn dies nicht möglich ist, verwenden Sie Cloudflare, um Bilder zwischenzuspeichern und bereitzustellen, während sie auf Ihrem Server gespeichert sind.

Und wenn selbst dies nicht möglich ist, macht es einen großen Unterschied, Ihre Webserver-Software ein wenig zu optimieren, um Assets zu komprimieren und den Browser des Besuchers zum Zwischenspeichern zu veranlassen. So würde ein Ausschnitt aus der Nginx-Konfiguration aussehen:

Server {

# Datei abgeschnitten

# gzip Komprimierungseinstellungen
gzip on;
gzip_comp_level 5;
gzip_min_length 256;
gzip_proxied any;
gzip_vary on;

# Browser-Cache-Steuerung
location ~ * \. (ico | css | js | gif | jpeg | jpg | png | woff | ttf | otf | svg | woff2 | eot) $ {
läuft 1d ab;
access_log off;
add_header Pragma public;
add_header Cache-Control "öffentlich, Höchstalter = 86400";;
}}
}}

Mir ist bewusst, dass die Bildoptimierung nichts mit Laravel zu tun hat, aber es ist ein so einfacher und mächtiger Trick (und wird so oft vernachlässigt), der mir nicht helfen kann.

Autoloader-Optimierung

Autoloading ist eine nette, nicht so alte Funktion in PHP, die die Sprache wohl vor dem Untergang bewahrt hat. Das Finden und Laden der relevanten Klasse durch Entschlüsseln einer bestimmten Namespace-Zeichenfolge nimmt jedoch Zeit in Anspruch und kann in Produktionsbereitstellungen vermieden werden, in denen eine hohe Leistung wünschenswert ist. Wieder einmal hat Laravel eine Lösung mit einem einzigen Befehl:

Composer installieren –optimize-autoloader –no-dev

Freunde dich mit Warteschlangen an

Warteschlangen So verarbeiten Sie Dinge, wenn es viele davon gibt, und jeder von ihnen dauert einige Millisekunden. Ein gutes Beispiel ist das Senden von E-Mails. Ein weit verbreiteter Anwendungsfall in Web-Apps besteht darin, einige Benachrichtigungs-E-Mails abzuschießen, wenn ein Benutzer bestimmte Aktionen ausführt.

Beispielsweise möchten Sie in einem neu eingeführten Produkt möglicherweise, dass die Unternehmensleitung (etwa 6-7 E-Mail-Adressen) benachrichtigt wird, wenn jemand eine Bestellung über einem bestimmten Wert aufgibt. Angenommen, Ihr E-Mail-Gateway kann in 500 ms auf Ihre SMTP-Anfrage antworten, dann sprechen wir von einer Wartezeit von gut 3-4 Sekunden für den Benutzer, bevor die Auftragsbestätigung einsetzt. Ein wirklich schlechtes Stück UX, da werden Sie sicher zustimmen.

Die Abhilfe besteht darin, Aufträge beim Eingang zu speichern, dem Benutzer mitzuteilen, dass alles gut gelaufen ist, und sie (einige Sekunden) später zu verarbeiten. Wenn ein Fehler auftritt, können die Jobs in der Warteschlange einige Male wiederholt werden, bevor sie als fehlgeschlagen deklariert werden.

Credits: Microsoft.com

Während ein Warteschlangensystem die Einrichtung ein wenig kompliziert (und einen gewissen Überwachungsaufwand verursacht), ist es in einer modernen Webanwendung unverzichtbar.

Asset-Optimierung (Laravel Mix)

Stellen Sie für alle Front-End-Assets in Ihrer Laravel-Anwendung sicher, dass eine Pipeline vorhanden ist, die alle Asset-Dateien kompiliert und minimiert. Diejenigen, die mit einem Bundlersystem wie Webpack, Gulp, Parcel usw. vertraut sind, müssen sich nicht darum kümmern, aber wenn Sie dies noch nicht tun, Laravel Mix ist eine solide Empfehlung.

Mix ist ein leichter (und ehrlich gesagt entzückender!) Wrapper um Webpack, der alle Ihre CSS-, SASS-, JS- usw. Dateien für die Produktion verwaltet. Eine typische .mix.js-Datei kann so klein sein und dennoch Wunder wirken:

const mix = require (‘laravel-mix’);

mix.js (‘resources / js / app.js’, ‘public / js’)
.sass (‘resources / sass / app.scss’, ‘public / css’);

Dies kümmert sich automatisch um Importe, Minimierung, Optimierung und den gesamten Shebang, wenn Sie für die Produktion bereit sind und die npm run-Produktion ausführen. Mix kümmert sich nicht nur um herkömmliche JS- und CSS-Dateien, sondern auch um Vue- und React-Komponenten, die möglicherweise in Ihrem Anwendungsworkflow enthalten sind.

Mehr Info Hier!

Fazit

Leistungsoptimierung ist mehr Kunst als Wissenschaft – zu wissen, wie und wie viel zu tun ist, ist wichtig als zu tun. Das heißt, es gibt kein Ende, wie viel und was Sie alles in einer Laravel-Anwendung optimieren können.

Aber was auch immer Sie tun, ich möchte Ihnen einige Ratschläge zum Abschied geben – die Optimierung sollte durchgeführt werden, wenn es einen soliden Grund gibt, und nicht, weil es sich gut anhört oder weil Sie in der Realität paranoid in Bezug auf die App-Leistung für mehr als 100.000 Benutzer sind es gibt nur 10.

Wenn Sie nicht sicher sind, ob Sie Ihre App optimieren müssen oder nicht, müssen Sie nicht in das sprichwörtliche Hornissennest treten. Eine funktionierende App, die sich langweilig anfühlt, aber genau das tut, was sie muss, ist zehnmal wünschenswerter als eine App, die für eine mutierte Hybrid-Supermaschine optimiert wurde, aber ab und zu flach fällt.

Und damit Newbiew ein Laravel-Meister wird, lesen Sie dies Online Kurs.

Mögen Ihre Apps viel, viel schneller laufen! ��

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me
    Like this post? Please share to your friends:
    Adblock
    detector
    map