¿Qué hace el firewall Symfony que tarda tanto?


Mi página de Symfony no es demasiado lenta (se carga en unos 400 ms), pero teniendo en cuenta el hecho de que es solo una simple página de hello world con autenticación básica, debería estar cargando en menos de 100 ms. Cuando entro en el generador de perfiles, veo esto:

Cronología del generador de perfiles

Observe que solo dice "Firewall" por 250 ms. Pensé que el firewall era solo 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 toma para obtener la información del usuario de la base de datos (que en este caso es de 61 ms).

¿Podría alguien explicar lo que el cortafuegos realmente hace? Si usted tiene algún consejo general sobre cómo aumentar el rendimiento del firewall, así que sería muy apreciado.


Nota : He buscado esto en Google, por supuesto, y quiero especificar por adelantado 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 todos los demás casos de Symfony lento cortafuegos que pude encontrar.


Algunos recursos de mi proyecto que podrían ser relevantes:

Author: Hubro, 2013-04-19

3 answers

Hice algunas búsquedas en Google y veo que este tipo, parece tener la respuesta a su pregunta.

Después de 15 minutos de investigación terminé averiguando que esto era debido al constructor PHP PDO (mi Firewall es el primero en conectarse a la base de datos como uso Entidades como usuarios). Con este conocimiento el problema era bastante rápidamente ([1], [2]): como resulta usar un nombre DNS (como' localhost') en lugar de una IP (como '127.0.0.1') causas este tema.

Una simple edición de los parámetros.archivo yml (cambiando localhost a 127.0.0.1) hizo el truco de reducir el tiempo de carga del Firewall a solo un mínimo.

 10
Author: Rawdreeg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:10:14

Por desgracia, resulta que Rawdreegtenía en parte razón. Hice un script PHP de 20 líneas para perfilar cuánto tiempo tarda en 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 de Symfony perfectamente. La buena noticia es que cuando mi aplicación se active, se conectará al servidor MySQL localmente por socket, ¡por lo que probablemente será increíblemente rápido! Sin embargo, hay poco que pueda hacer sobre la velocidad durante el desarrollo, aparte de reflejar el servidor MySQL localmente.

Así que para resumir la respuesta; el firewall Symfony crea inicialmente 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 perfilado 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.

 9
Author: Hubro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:01:59

Su servidor MySQL podría ser el problema. Intente agregar skip-name-resolve a la sección [mysqld] de su archivo my.cnf. Esto impide que MySQL realice una búsqueda DNS inversa en la dirección IP de las conexiones entrantes.

 0
Author: longneck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-25 14:30:48