Meine Symfony-Seite ist nicht zu langsam (sie lädt in etwa 400 ms), aber wenn man bedenkt, dass es sich nur um eine einfache Hallo-Welt-Seite mit grundlegender Authentifizierung handelt, sollte sie in weniger als 100 ms geladen werden. Wenn ich den Profiler betrete, sehe ich Folgendes:
Beachten Sie, dass nur 250 ms lang „Firewall“ angezeigt wird. Ich dachte, die Firewall sei nur dafür verantwortlich, Benutzer von bestimmten Bereichen der Seite fernzuhalten – ich kann mir nicht vorstellen, dass es länger als ein paar Millisekunden plus die Zeit dauert, die zum Abrufen der Benutzerinformationen aus der Datenbank benötigt wird (was in diesem Fall 61ms).
Könnte jemand erklären, was die Firewall tatsächlich tut? Wenn Sie allgemeine Hinweise zur Steigerung der Firewall-Leistung haben, wäre das sehr zu schätzen.
Notiz: Ich habe das natürlich gegoogelt und möchte im Voraus angeben, dass ich die Verbindung zur MySQL-Datenbank über die IP-Adresse und nicht über den Hostnamen herstelle. Dies schien das Problem für jeden anderen Fall einer langsamen Symfony-Firewall zu sein, den ich finden konnte.
Einige Ressourcen aus meinem Projekt, die relevant sein könnten:
Ich vermute, dass alle Regeln in security.yml ausgeführt werden, die Abschnitte für Anbieter, Zugriffskontrolle und Firewalls können ziemlich unangenehm werden, und es ist zeitaufwändig, alle diese für jede Anfrage zu überprüfen.
– MG
19. April 2013 um 18:47 Uhr
@ xr09: 251 ms ist a Ja wirklich lange Zeit (in Computerzeit). Ich kann nicht erkennen, dass das einfache Lesen der zwischengespeicherten Konfiguration und das Anwenden auf den Sicherheitskontext auch nur annähernd so lange dauern könnte.
– Hubro
19. April 2013 um 18:53 Uhr
Ich habe gerade bemerkt, Ihr Astrups/SpectacleBundle/Entity/User.php bricht die Grundsatz der Einzelverantwortung.
– Yang
20. April 2013 um 2:35 Uhr
Versuchen Sie, ein Profil zu verwenden. XDebug und XHProf sind wirklich gut. Außerdem gibt es Bundle für den zweiten: github.com/jonaswouters/XhprofBundle. So können Sie herausfinden, welche Methode der Engpass ist
– Cyprian
20. April 2013 um 14:33 Uhr
Ich würde gerne hören, warum diese Frage abgelehnt wurde
– Hubro
20. April 2013 um 17:09 Uhr
Rawdreeg
Ich habe etwas gegoogelt und das sehe ich dieser Typscheint die Antwort auf Ihre Frage zu haben.
Nach 15 Minuten Recherche stellte ich fest, dass dies am PHP-PDO-Konstruktor lag (meine Firewall ist die erste, die sich mit der Datenbank verbindet, da ich Entitäten als Benutzer verwende). Mit diesem Wissen war das Problem ziemlich schnell gefunden ([1], [2]): Wie sich herausstellt, verursacht die Verwendung eines DNS-Namens (wie „localhost“) anstelle einer IP (wie „127.0.0.1“) dieses Problem.
Eine einfache Bearbeitung der Datei parameters.yml (Änderung von localhost auf 127.0.0.1) hat den Trick getan, die Ladezeit der Firewall auf ein Minimum zu reduzieren.
Für Ihre Information, es ist besser um die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Da die Zielressource nicht garantiert in der Zukunft am Leben ist.
– j0k
24. April 2013 um 7:25 Uhr
Ich habe in meiner Frage klar angegeben, dass dies der Fall ist nicht die Angelegenheit. Überprüf den Notiz: Teil.
– Hubro
25. April 2013 um 7:21 Uhr
woooow! Vielen Dank
– Frieden Liebe
30. Juli 2018 um 9:00 Uhr
Hubro
Leider stellte sich heraus, dass Rawdreeg es war teilweise Rechts. Ich habe ein 20-zeiliges PHP-Skript erstellt, um zu profilieren, wie lange es dauert, eine Verbindung zu meinem MySQL-Server herzustellen:
Connection took 230.18503189087 ms
Query took 64.532995223999 ms
Was die Lücken des Symfony-Profilers füllt perfekt. Die gute Nachricht ist, dass meine Anwendung, wenn sie live geht, lokal per Socket eine Verbindung zum MySQL-Server herstellt, also wahrscheinlich blitzschnell! An der Geschwindigkeit während der Entwicklung kann ich jedoch wenig ändern, außer den MySQL-Server lokal zu spiegeln.
Um die Antwort zusammenzufassen; Die Symfony-Firewall stellt zunächst die Verbindung zur MySQL-Datenbank her, und in meinem Fall ist diese Verbindung ziemlich langsam. Die MySQL-Verbindungszeit macht in meinem Fall über 80 % der Profilzeit der Firewall aus.
Notiz: Ich verbinde mich bereits über die IP-Adresse mit dem MySQL-Server und habe hinzugefügt skip-name-resolve zur MySQL-Konfiguration ohne Erfolg.
Ich habe eine App, die nicht für die Verwendung einer Datenbank konfiguriert ist, dasselbe Problem. Ich glaube nicht, dass das die eigentliche Ursache ist.
– Anleitung
7. Februar 2018 um 21:40 Uhr
@guice Es war in meinem Fall.
– Hubro
8. Februar 2018 um 8:21 Uhr
Ihr MySQL-Server könnte das Problem sein. Versuchen Sie, hinzuzufügen skip-name-resolve zum [mysqld] Abschnitt Ihrer my.cnf Datei. Dies hindert MySQL daran, eine umgekehrte DNS-Suche für die IP-Adresse eingehender Verbindungen durchzuführen.
Danke für den Vorschlag, das werde ich prüfen. Aber würde die Verbindung zu MySQL nicht im Profiler unter “Doctrine” gehen?
– Hubro
25. April 2013 um 17:41 Uhr
Ich weiß nicht. Ich habe mich nur an das Zitat in Rawdreegs Antwort gehalten, das impliziert, dass die Firewall-Komponente eine / die Datenbankverbindung öffnet.
– langer Hals
25. April 2013 um 17:52 Uhr
Es hat leider nicht geholfen. Ihre Antwort veranlasste mich jedoch, ein Skript zu schreiben, um die Verbindungszeit zu profilieren, was wiederum meine Frage beantwortete.
– Hubro
25. April 2013 um 20:26 Uhr
13330700cookie-checkWas macht die Symfony-Firewall so lange?yes
Ich vermute, dass alle Regeln in security.yml ausgeführt werden, die Abschnitte für Anbieter, Zugriffskontrolle und Firewalls können ziemlich unangenehm werden, und es ist zeitaufwändig, alle diese für jede Anfrage zu überprüfen.
– MG
19. April 2013 um 18:47 Uhr
@ xr09: 251 ms ist a Ja wirklich lange Zeit (in Computerzeit). Ich kann nicht erkennen, dass das einfache Lesen der zwischengespeicherten Konfiguration und das Anwenden auf den Sicherheitskontext auch nur annähernd so lange dauern könnte.
– Hubro
19. April 2013 um 18:53 Uhr
Ich habe gerade bemerkt, Ihr
Astrups/SpectacleBundle/Entity/User.php
bricht die Grundsatz der Einzelverantwortung.– Yang
20. April 2013 um 2:35 Uhr
Versuchen Sie, ein Profil zu verwenden. XDebug und XHProf sind wirklich gut. Außerdem gibt es Bundle für den zweiten: github.com/jonaswouters/XhprofBundle. So können Sie herausfinden, welche Methode der Engpass ist
– Cyprian
20. April 2013 um 14:33 Uhr
Ich würde gerne hören, warum diese Frage abgelehnt wurde
– Hubro
20. April 2013 um 17:09 Uhr