Was macht die Symfony-Firewall so lange?

Lesezeit: 4 Minuten

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:

Profiler-Zeitachse

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

Benutzer-Avatar
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

Benutzer-Avatar
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:

<?php

$time = microtime(true);

$con = new PDO(...);

$connect_time = microtime(true);

$result = $con->query('SHOW TABLES');

$query_time = microtime(true);

var_dump($result->fetchAll(PDO::FETCH_ASSOC));

$time_con = ($connect_time - $time) * 1000;
$time_query = ($query_time - $connect_time) * 1000;

echo "Connection took $time_con ms\n";
echo "Query took $time_query ms\n";

Die Ausgabe war:

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

1333070cookie-checkWas macht die Symfony-Firewall so lange?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy