Laravel Fehler

Laravel Eloquent Performance Tipp

Einfache Konventionen

Ich bin ein absoluter Laravel Fan, das vorneweg. Jedoch gibt es so gewisse Dinge, die es zu wissen gibt – oder die man einfach wissen muss um die Performance von Laravel nicht negativ zu beeinflussen oder sie gar noch zu verbessern.

Welche Fehler können auf Performanceprobleme hinweisen?

Apache & PHP-FPM memory usage: Diesen Fehler von PLESK kennen vielleicht die Meisten unter uns, gerade wenn die Relationships komplizierter werden und die Anwendung komplexer. Dies bedeutet einen Performancefehler in der Anwendung.

Tipps: Relationships

Gib die Parameter an!

Laravel selbst schreibt in der eigenen Doku von Funktionen wie return $this->morphTo(); oder einem simplen return $this->belongsTo(User::class);. Das ist zweifelsohne sehr praktisch, oder? Schließlich passiert all die “Magic” unter der Haube und Laravel weiß wie von Geisterhand wohin “gemorphed” wird und wohin es “belongt”.

Doch ganz so simpel ist es nicht, wenn du dir das nachfolgende Codebeispiel ansiehst:

public function taggable()
{ 
    return $this->morphTo(__FUNCTION__);
}

public function user()
{
    return $this->belongsTo(User::class, 'user_id', 'id', __FUNCTION__)
}

Erklärung:

Wenn wir uns die Funktion morphTo ansehen, dann finden wir da “eigentlich” weitere Attribute, wie $name = null, $type = null und $id = null.

Und darunter siehst du, wie Laravel den Namen “errät” (also guess). Dass dies aber jetzt zusätzlich Ressourcen benötigt, das dürfte auf der Hand liegen…

Dementsprechend “läuft” Laravel den Stack Trace (oder auch Debug Trace) ab, also genau den Stapel an Befehlen der dem jetzigen voranging. Das bedeutet: Laravel “schaut”, wie der Name sein könnte. Hier “function taggable”, also “taggable”. Und genau diese Schritte sind unnötig und zu vermeiden.

// MorphTo Example

public function morphTo($name = null, $type = null, $id = null)
{
        
   $name = $name ?: $this->guessBelongsToRelation();

   list($type, $id) = $this->getMorphs(
       Str::snake($name), $type, $id
   );

        
   return empty($class = $this->{$type})
                ? $this->morphEagerTo($name, $type, $id)
                : $this->morphInstanceTo($class, $name, $type, $id);
}

protected function guessBelongsToRelation()
{
   list($one, $two, $caller) = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 3);

   return $caller['function'];
}

// BelongsToMany Example

public function belongsToMany($related, $table = null, $foreignPivotKey = null, $relatedPivotKey = null, $parentKey = null, $relatedKey = null, $relation = null)
{
      
   if (is_null($relation)) {
      $relation = $this->guessBelongsToManyRelation();
   }

   $instance = $this->newRelatedInstance($related);

   $foreignPivotKey = $foreignPivotKey ?: $this->getForeignKey();

   $relatedPivotKey = $relatedPivotKey ?: $instance->getForeignKey();

   if (is_null($table)) {
       $table = $this->joiningTable($related);
   }

   return $this->newBelongsToMany(
       $instance->newQuery(), $this, $table, $foreignPivotKey,
       $relatedPivotKey, $parentKey ?: $this->getKeyName(),
       $relatedKey ?: $instance->getKeyName(), $relation
   );
}

protected function guessBelongsToManyRelation()
{
   $caller = Arr::first(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS), function ($trace) {
       return ! in_array($trace['function'], Model::$manyMethods);
   });

   return ! is_null($caller) ? $caller['function'] : null; 
}

Fazit: Versuche nach Möglichkeit zukünftig bei performanten Anwendungen die “guess” Attribute mitzuliefern und nicht aus “Faulheit” zu überspringen. Und ja 😎 ich weiß… Das ist ja nur eine Kleinigkeit ;-)… Aber viele Kleinigkeiten führen zu einer großen Wirkung. Daher ist das nicht wirklich ein Argument zu sagen “ach, ich lass es mal bleiben”. Viel Spaß beim Coden 🙂

Du willst Laravel lernen?

Schau bei unseren Onlinekursen vorbei! Sie zeigen dir alles von A-Z, was Du für den perfekten Einstieg in Laravel benötigst!



Andreas Pabst

Andreas Pabst hilft als langjähriger IT Trainer, Fachkräftetrainer und Führungskräftetrainer europaweit Firmen und Teams dabei gemeinsam mehr zu erreichen. Profitieren Sie von didaktischen Fähigkeiten als Hochschuldozent gleichermaßen wie von seiner Tätigkeit als Speaker und somit äußerst unterhaltsamen Seminaren.

Share
Veröffentlicht von
Andreas Pabst

Neue Beiträge

Wie erstelle ich eine Laravel Middleware: Schritt für Schritt Anleitung

Voraussetzung: Du musst ein Laravel Projekt erstellt haben und dich im Projektordner befinden. Um ein…

1 Jahr ago

Wie erstelle ich einen Laravel Job in der Queue?

Um eine Laravel-Queue zu erstellen, die eine E-Mail verschickt, müssen zunächst einmal alle Anforderungen für…

1 Jahr ago

Laravel Anfänger und Einsteiger Tutorial

Dieses Tutorial soll den perfekten und einfachen Einstieg in die Welt des Laravel Frameworks bieten.…

1 Jahr ago

Laravel – Please provide a valid cache path

Neue Installation Laravel wirft häufig nach Installationen auf einem neuen System, ob Entwicklungsserver, Lokal oder…

4 Jahren ago

Model Beziehungen – Laravel Model Relationships

Laravel bietet verschiedene Möglichkeiten an, Beziehungen von Models abzubilden. Übersicht über die drei wichtigsten Beziehungen…

4 Jahren ago

Laravel Storage Symbolik Links korrekt verlinken

Automatisches Erstellen von Symbolic Links in Laravel Der Beste Weg symbolische Links zu erstellen ist…

4 Jahren ago

This website uses cookies.