php - form - symfony role
¿Qué hace el firewall Symfony que demora tanto? (3)
Hice algunos googleos y veo que este chico parece tener la respuesta a tu pregunta.
Después de 15 minutos de investigación, terminé averiguando que esto se debía al constructor PHP PDO (mi Firewall es el primero en conectarse a la base de datos ya que utilizo entidades como usuarios). Con este conocimiento, el problema se encontró bastante rápidamente ( [1] , [2] ): como resulta usar un nombre DNS (como ''localhost'') en lugar de una IP (como ''127.0.0.1'') causa este problema.
Una simple edición del archivo parameters.yml (cambiando localhost a 127.0.0.1) hizo el truco de reducir el tiempo de carga del Firewall a solo un mínimo.
Mi página de Symfony no es demasiado lenta (se carga en unos 400 ms), pero considerando el hecho de que es solo una página de hello world con autenticación básica, debería cargarse en menos de 100 ms. Cuando entro en el generador de perfiles, veo esto:
Observe que solo dice "Firewall" por 250 ms. Pensé que el cortafuegos era el único responsable de mantener a los usuarios fuera de ciertas áreas de la página. No puedo imaginar que tome más de unos pocos milisegundos más el tiempo que lleva obtener la información del usuario de la base de datos (que en este caso es 61 ms).
¿Alguien podría explicar lo que realmente hace el firewall? Si tiene alguna sugerencia general sobre cómo aumentar el rendimiento del firewall también, sería muy apreciado.
Nota : Por supuesto, he buscado en Google, y quiero especificar desde el principio que me estoy conectando a la base de datos MySQL por dirección IP, no por nombre de host. Este parecía ser el problema para cualquier otro caso de cortafuegos Symfony lento que pude encontrar.
Algunos recursos de mi proyecto que podrían ser relevantes:
Por desgracia, resultó que Rawdreeg tenía razón en parte . Hice un script PHP de 20 líneas para hacer un perfil de cuánto tiempo lleva conectarse a mi servidor 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";
La salida fue:
Connection took 230.18503189087 ms Query took 64.532995223999 ms
Que llena los espacios en blanco del perfilador Symfony perfectamente . La buena noticia es que cuando mi aplicación entre en funcionamiento, se conectará al servidor MySQL localmente por socket, ¡así que probablemente sea increíblemente rápido! Sin embargo, hay poco que puedo hacer sobre la velocidad durante el desarrollo, aparte de duplicar el servidor MySQL localmente.
Entonces, para resumir la respuesta; el firewall Symfony inicialmente crea la conexión a la base de datos MySQL, y en mi caso, esa conexión es bastante lenta. El tiempo de conexión de MySQL representa más del 80% del tiempo de perfil del firewall en mi caso.
Nota: Ya me estoy conectando al servidor MySQL por dirección IP, y he agregado skip-name-resolve
a la configuración de MySQL en vano.
Su servidor MySQL podría ser el problema. Intente agregar skip-name-resolve
a la sección [mysqld]
de su archivo my.cnf
. Esto evita que MySQL haga una búsqueda DNS inversa en la dirección IP de las conexiones entrantes.