web-dev-qa-db-fra.com

Que fait le pare-feu Symfony qui prend si longtemps?

Ma page Symfony n'est pas trop lente (elle se charge en environ 400 ms) mais compte tenu du fait qu'il ne s'agit que d'une simple page Hello World avec authentification de base, elle devrait se charger en moins de 100 ms. Lorsque j'entre dans le profileur, je vois ceci:

Profiler timeline

Notez qu'il dit simplement "Firewall" pendant 250 ms. Je pensais que le pare-feu était juste responsable de garder les utilisateurs hors de certaines zones de la page - je ne peux pas imaginer que cela prenne plus de quelques millisecondes plus le temps qu'il faut pour récupérer les informations utilisateur de la base de données (qui dans ce cas est 61 ms).

Quelqu'un pourrait-il expliquer ce que fait réellement le pare-feu? Si vous avez également des conseils généraux sur la façon d'augmenter les performances du pare-feu, cela serait grandement apprécié.


Remarque : J'ai googlé cela bien sûr, et je veux spécifier à l'avance que je me connecte à la base de données MySQL par adresse IP, pas par nom d'hôte . Cela semblait être le problème pour tous les autres cas de pare-feu Symfony lent que je pouvais trouver.


Quelques ressources de mon projet qui pourraient être pertinentes:

59
Hubro

Hélas, il s'avère Rawdreeg était en partie à droite. J'ai créé un script de 20 lignes PHP pour profiler combien de temps il faut pour se connecter à mon serveur MySQL:

<?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";

Le résultat était:

La connexion a pris 230,18503189087 ms 
 La requête a pris 64,532995223999 ms

Ce qui remplit les blancs du profileur Symfony parfaitement. La bonne nouvelle est que lorsque mon application sera mise en ligne, elle se connectera au serveur MySQL localement par socket, donc ça va probablement être rapide! Cependant, je ne peux pas faire grand chose sur la vitesse pendant le développement, à part la mise en miroir locale du serveur MySQL.

Donc, pour résumer la réponse; le pare-feu Symfony crée initialement la connexion à la base de données MySQL, et dans mon cas, cette connexion est assez lente. Le temps de connexion MySQL représente plus de 80% du temps profilé du pare-feu dans mon cas.


Remarque: Je me connecte déjà au serveur MySQL par adresse IP et j'ai ajouté skip-name-resolve à la configuration MySQL en vain.

9
Hubro

J'ai fait une recherche sur Google et je vois que ce gars , semble avoir la réponse à votre question.

Après 15 minutes de recherche, j'ai fini par comprendre que cela était dû au constructeur PHP PDO (mon pare-feu est le premier à se connecter à la base de données lorsque j'utilise des entités en tant qu'utilisateurs). le problème a été trouvé assez rapidement ( [1] , [2] ): car il s'avère utiliser un nom DNS (comme 'localhost') au lieu d'une IP (comme '127.0.0.1') provoque ce problème.

Une simple modification du fichier parameters.yml (en changeant localhost en 127.0.0.1) a permis de réduire le temps de chargement du pare-feu au minimum.

10
Rawdreeg

Votre serveur MySQL pourrait être le problème. Essayez d'ajouter skip-name-resolve à la [mysqld] section de votre my.cnf fichier. Cela empêche MySQL d'effectuer une recherche DNS inversée sur l'adresse IP des connexions entrantes.

0
longneck