Heim  >  Artikel  >  Backend-Entwicklung  >  Laravel-Ressource oder maßgeschneidertes Repo?

Laravel-Ressource oder maßgeschneidertes Repo?

PHPz
PHPzOriginal
2024-08-21 16:37:32370Durchsuche

Anfang dieser Woche stieß ich bei der Arbeit mit der Laravel Rest API auf ein Ärgernis in Form eines Timeout-Fehlers. Dies führt zu Frustration der Endbenutzer über Entwicklungsbedenken. Lassen Sie mich das Gesamtszenario kurz erläutern:

Ich musste Daten aus einer externen Datenquelle laden, filtern und dann für eine JSON-Rückgabe vorbereiten. Die Datenmenge war nicht groß, nur etwa 10.000 in einer einzigen Anfrage. Das Hauptproblem trat auf, als ich versuchte, sie zu formatieren, nachdem ich sie abgerufen und gefiltert hatte. Also begann ich mit dem Debuggen mit dem folgenden Schritt:

  • Überprüfen Sie, ob die Abfrage optimiert ist und die Spalten ebenfalls indiziert sind.

  • Stellen Sie sicher, dass Sie die Chunk-Methode verwenden

  • Überprüfen Sie, dass das Formatierungs-Repo keine unnötigen Methoden/Referenzen/Implementierungen/unbenutzten Funktionen/externen API-Aufrufe verwendet.

Alle Prüfungen sind abgeschlossen, aber es wird immer noch ein Gateway-Timeout-Fehler angezeigt, da er mehr als 1 Minute überschreitet. Die Serviceklasse sieht wie folgt aus:

Laravel Resource or Customized Repo?

Die Repo-Klasse sieht wie folgt aus:

Laravel Resource or Customized Repo?

Mit bloßem Auge sollte es bei der Verarbeitung und Manipulation von mehr als 10.000 Daten keinen Timeout-Fehler geben. Wir werden am Ende besprechen, warum es passiert (vielleicht ist es kein wirklich konkreter Grund, aber wahrscheinlich) und besprechen nun, wie ich es mit der Laravel-API-Ressource lösen kann.


Es ist einfach zu implementieren. Generieren Sie zunächst die Laravel-API-Ressource über die Befehlszeile:

php artisan make:resource DataFormatterResource

Senden Sie dann Ihr Modellobjekt an die Ressource und formatieren/manipulieren Sie Ihre Daten gemäß den unten angegebenen Anforderungen:

Laravel Resource or Customized Repo?

Laravel Resource or Customized Repo?

Überraschenderweise dauerte die Antwort nur 3,7 Sekunden?!
Ich habe versucht, das eigentliche Problem hier herauszufinden und habe einige wahrscheinliche Fälle gefunden, die oben erwähnt wurden, um sie am Ende zu definieren. Die Fälle sind angegeben:

  1. Laravel-API-Ressourcen bieten eine konsistente Schnittstelle für den Zugriff auf und die Bearbeitung von Daten, wenn ich Repo mit einer gewissen Abhängigkeitsinjektion verwende. Dies macht es einfacher, effizienten Code zu schreiben und häufige Leistungsengpässe zu vermeiden.
  2. Laravel-API-Ressourcen sind auf Leistung optimiert, da sie Caching und andere Techniken verwenden, um die Geschwindigkeit des Datenabrufs und der Datenverarbeitung zu verbessern, während ich nur einen Teil der Array-Rohformatierung verwende.
  3. Laravel-API-Ressourcen serialisieren die Ergebnisse von Datenbankabfragen je nach Anforderungsheader automatisch in JSON oder XML. Dies erspart Ihnen den Aufwand, Ihren eigenen Serialisierungscode schreiben zu müssen.

Bei den meisten Diensten meines Projekts habe ich Repo oder einen funktionalen Formatierer auf der Dienstebene verwendet, aber in diesem Fall hatte ich ein Problem, bei dem es andere Ursachen für das Auftreten dieses Problems geben könnte.
Was ich betonen möchte, ist, dass Laravel Resources in einigen schwierigen Situationen bei der Arbeit mit Modellen nützlich sein kann.

Wenn Ihnen dieser Artikel gefällt, hinterlassen Sie einen Klatsch oder einen Kommentar.

Das obige ist der detaillierte Inhalt vonLaravel-Ressource oder maßgeschneidertes Repo?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:Steinspiel IINächster Artikel:Steinspiel II