2015-11-18 8 views
9

Laravels beredte Modelle sind standardmäßig auf "Lazy Load" eingestellt. Das Problem ist, dass es viele Anfragen an die Datenbank stellt und insbesondere bei hohem Datenverkehr stürzt die Laravel-Anwendung ab, wohingegen eine ähnliche Anwendung, die auf Yii 1 aufbaut, keine Probleme hat.Setzen Sie Laravel Eloquent-Modelle standardmäßig auf "Eager".

Nach der Installation der Laravel-Debug-Leiste ist das Problem, dass bei jedem Laden der Seite zu viele Abfragen ausgeführt werden. Der nächste Schritt ist die Abfrage der Optimierung. Ich habe eifriges Laden verwendet, wie in der Dokumentation von Laravel beschrieben, aber immer noch zu viele Anfragen.

Ich frage mich, ob es eine Möglichkeit gibt, Eloquent nur auf "Eager Load" in der Entwicklungsumgebung einzustellen. Wenn die Seite nicht geladen werden kann, ist es einfacher, das Problem zu identifizieren.

+1

Sie Informationen über Möglichkeiten angefordert haben dev-nur eifrig Last zu setzen, aber es klingt wie Ihr Problem ist " zu viele Abfragen ". Da Sie einen Anwendungsabsturz gemeldet haben, wäre es auch hilfreich zu wissen, was die Fehlerausgabe oder das Protokoll als Grund für den Absturz anzeigt. – Trip

Antwort

2

Die Lösung für hohe Datenbankbelastung ist Cache.

Durch die richtige Cachespeicherung können Sie bei hohem Datenaufkommen eine unglaubliche Leistung erzielen, da gängige Datenbankabfragen auf Null reduziert und in RAMs umgeleitet werden, die schneller sind.

Route Caching aktiviert, wird zu perfomance erhöhen:

php artisan route:cache 

EDIT:

Als Fx32 Punkte, sollten Sie sicherstellen, dass Sie Eloquent brauchen und nicht besser wären, die gleiche Abfrage machen direkt an den DB, die die benötigten Tabellen verbindet und eine einzige Abfrage statt einer Menge erstellt:

Cache ist keine gute Lösung zur Behebung schlechter Datenbankabfragen. Eloquent ist großartig, aber oft ist es besser, richtige Abfragen mit einige Joins zu schreiben. Machen Sie Ihre Datenbank nicht einfach fertig und werfen Sie dann alle Ergebnisse in einen Cache, da dies zu neuen Problemen führt. Wenn Ihr Fall nicht eine flache CRUD API ist, sind ActiveRecord Muster möglicherweise nicht die beste Lösung . Wenn Sie die Ergebnisse aus der Datenbank sorgfältig auswählen und verknüpfen und den Abruf solcher Objekte beschleunigen möchten, kann die Zwischenspeicherung helfen.

+1

Ich habe Caching als nächsten Schritt im Optimierungsprozess. Bevor ich mich in Caching reinziehe, möchte ich sicherstellen, dass alle Abfragen so optimiert wie möglich sind. – elixir

+1

Cache ist keine gute Lösung zur Behebung fehlerhafter Datenbankabfragen. Eloquent ist großartig, aber oft ist es besser, richtige Abfragen mit einigen Joins zu schreiben. Machen Sie Ihre Datenbank nicht einfach fertig und werfen Sie alle Ergebnisse in einen Cache, da dies zu neuen Problemen führt. Wenn Ihr Anwendungsfall keine flache CRUD-API ist, sind ActiveRecord-Muster möglicherweise nicht die beste Lösung. Wenn Sie die Ergebnisse aus der DB sorgfältig auswählen und verknüpfen und den Abruf solcher Objekte beschleunigen möchten, kann Caching hilfreich sein. – Fx32

25

Sie können Standardwerte Beziehungen auf „eifrig Last“ direkt auf den Modellen:

Class MyModel extends Model { 
    protected $with = ['relation']; 
} 
Verwandte Themen