Laravel 5.2 view composer wird mehrfach ausgeführt

8

Ich hatte einige (größere) Leistungsprobleme in einem Projekt, an dem ich arbeite, und nachdem ich alle Abfragen protokolliert hatte, die ausgeführt wurden, wurde mir klar, dass viele von ihnen mehrfach ausgeführt werden und ich nicht zum Problem komme / p>

Alle Abfragen, die mehrfach ausgeführt werden, sind in meinem View-Composer-Provider.

So sieht mein View Composer aus:

%Vor%

Diese beiden Abfragen (Sidbar- und Footer-Kategorien) werden etwa sechsmal ausgeführt, obwohl jedes Teil genau einmal aufgerufen wird. Sie werden beide in der Master-Ansicht mit @include ('Teilname') aufgerufen.

Ich habe es versucht:

%Vor%

Aber der offsetExists gibt immer false zurück (selbst nachdem er 5. mal aufgerufen wurde).

Irgendeine Idee, warum das passiert und was ich falsch mache?

Bearbeiten:

Ich habe erkannt, wo das Problem liegt. Auf der Seite, die ich besuche (wo diese multiplen Abfragen ausgeführt werden), gibt es einige 404 Elemente (meistens Bilder). Jedes Mal, wenn eine Datei nicht gefunden wird, wird eine neue 404-Ausnahme ausgelöst. Und jedes Mal, wenn eine 404-Ausnahme ausgelöst wird, wird die 404-Ansicht ausgeführt = & gt; Bedeutung Fußzeile / Sidebar-Abfragen werden auch ausgeführt (wie sie ein Teil der 404-Ansicht sind). Beispiel: Ссылка

Die Folgefrage ist also, wie verhindert werden kann, dass die Ansicht gerendert wird, wenn dies nicht notwendig ist (Beispiel: 404 ist ein Bild, das nicht gefunden wurde).

Hier ist ein Stück Code von meinen Routen, von dem ich annehme, dass dies der Grund ist:

%Vor%

PS: Ich weiß, dass dieser Teil des Codes extrem unoptimiert ist (da er grundsätzlich die gleiche Abfrage zweimal ausführt, einmal um zu sehen, ob das Element existiert, ein anderes Mal tatsächlich im Controller). Dies ist Arbeit in Arbeit und es ist auf Todo-Liste.

Bearbeiten 2:

Ich habe die nächste Lösung gefunden, ich bin offen für Verbesserungen, da dies eine ziemlich hack-ish-Art ist (wenn ich weitere Ordner hinzufüge, muss ich daran denken, dies auch zu aktualisieren). Ich habe nur 3 direkte Unterordner im öffentlichen Ordner: etwas, Dateien und Ressourcen.

Die Lösung besteht darin, das erste Segment der URL beim Rendern der Ausnahme zu prüfen (in der Datei app / Exceptions / Handler.php) und die 404-Antwort ohne die Ansicht zurückzugeben, wenn sie mit einem der drei Ordner übereinstimmt:

%Vor%

Vielen Dank im Voraus

    
devk 23.12.2016, 10:21
quelle

2 Antworten

5

Richten Sie keine Dateianforderungen über Laravel und ein leeres Bild auf 404

.htaccess Beispiel:

%Vor%

Sie würden dies über die Regeln stellen, die zu index.php

umleiten

Dies setzt voraus, dass Bilder von der Website und nicht durch Streaming von Datenbankinhalten bereitgestellt werden.

Grundsätzlich passiert Folgendes:

  • Back-End-Benutzer lädt Bild hoch:
  • laravel speichert das Bild in /some/path/to/store/data/public/12a/4d8/458/12a4d8458.gif
  • laravel speichert das Bild als 12a4d8458.gif in Ihrer Datenbank
  • -------------------- Zeit vergeht ------------------------
  • Besucheranfragen Seite.
  • Anfrage stimmt nicht mit einer Datei überein. Umleiten zu index.php (gemäß .htaccess)
  • Anfrage wird an index.php
  • gesendet
  • Laravel baut Seite. Findet das Bild
  • laravel erstellt den vollständigen öffentlichen URL-Pfad
  • www.awesome.com/data/public/12a/4d8/458/12a4d8458.gif
  • komponierte HTML-Inhalte werden an Besucher weitergeleitet
  • ---------------- Millisekunden übergeben ------------------------
  • Besucheranfragen image /data/public/12a/4d8/458/12a4d8458.gif
  • Anfrage entspricht Dateidatei wird von Apache bedient
  • laravel bleibt glücklicherweise nicht auf Anfrage
  • ----------------- keine Millisekunde ist vergangen -------------
  • Besucheranfragen image /data/public/4e8/d44/98f/4e8d4498f.gif
  • Anfrage stimmt nicht mit einer Datei überein. Umleiten zu index.php (gemäß .htaccess)
  • Laravel baut Seite. findet keine Route.
  • laravel ruft 404 Routinen auf
  • laravel erstellt 404-Seite mit allen zugeordneten Triggern
  • laravel dient 404 als Benutzer

Im letzten Schritt sollten Sie also verhindern, dass die Bildanforderung sogar Laravel erreicht, indem Sie Ihr eigenes Bild gemäß den .htaccess-Regeln bereitstellen. So kann Ihr Webserver viel schneller auf das fehlende Bild reagieren.

    
Tschallacka 29.12.2016, 12:01
quelle
1

Dateiendung prüfen

Anstatt die URL-Segmente für die spezifischen Pfade zu überprüfen, und wenn Sie sagen, dass es nur Bilder sind. Also, wenn es nur für Dinge mit bestimmten Erweiterungen benötigt wird, können Sie das überprüfen und eine einfachere 404 Antwort für diese zurückgeben:)

%Vor%

Caching

Habe gerade gemerkt, dass es viele Anfragen gab. Vielleicht so etwas, cache die Ergebnisse für 1 Minute, das sollte lang genug sein für die nächsten 404 Anfragen auf der Seite, um den Cache aufzunehmen, anstatt die Abfragen auszuführen:)

%Vor%     
martindilling 29.12.2016 12:15
quelle

Tags und Links