Подтвердить что ты не робот

Что брандмауэр Symfony делает так долго?

Моя страница Symfony не слишком медленная (она загружается примерно через 400 мс), но, учитывая тот факт, что это просто простая всемирная страница приветствия с базовой аутентификацией, она должна быть загружена менее чем за 100 мс. Когда я вхожу в профилировщик, я вижу следующее:

Profiler timeline

Обратите внимание, что это просто говорит "Брандмауэр" за 250 мс. Я думал, что брандмауэр был просто ответственен за то, что пользователи не попали в определенные области страницы - я не могу себе представить, что это займет не более нескольких миллисекунд плюс время, необходимое для получения пользовательской информации из базы данных (которая в этом случае 61 мс).

Может кто-нибудь объяснить, что на самом деле делает брандмауэр? Если у вас есть общие указатели о том, как повысить производительность брандмауэра, это будет очень полезно.


Примечание. У меня это, конечно, есть в Googled, и я хочу указать фронт, что я подключаюсь к базе данных MySQL по IP-адресу, а не по имени хоста. Это казалось проблемой для всех остальных случаев медленного брандмауэра Symfony, который я мог найти.


Некоторые ресурсы из моего проекта, которые могут иметь значение:

4b9b3361

Ответ 1

Увы, оказалось, что Rawdreeg отчасти прав. Я сделал 20 строк PHP скрипт, чтобы узнать, сколько времени требуется для подключения к моему серверу 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";

Выход был:

Connection took 230.18503189087 ms
Query took 64.532995223999 ms

Заполняет пробелы профилировщика Symfony. Хорошей новостью является то, что, когда мое приложение будет работать в прямом эфире, оно будет подключаться к серверу MySQL локально через сокет, поэтому он, вероятно, быстро вспыхнет! Я мало что могу сказать о скорости во время разработки, кроме как зеркалировать сервер MySQL локально.

Итак, чтобы обобщить ответ; брандмауэр Symfony изначально создает соединение с базой данных MySQL, и в моем случае это соединение происходит довольно медленно. Время соединения с MySQL составляет более 80% времени профилированного брандмауэра в моем случае.


Примечание: Я уже подключаюсь к серверу MySQL по IP-адресу, и я добавил skip-name-resolve в конфигурацию MySQL безрезультатно.

Ответ 2

Я сделал несколько поисковых запросов, и я вижу, что этот парень, кажется, имеет ответ на ваш вопрос.

После 15 минут исследований я закончил выяснять, что это было связано к конструктору PHP PDO (мой брандмауэр первым подключился к поскольку я использую Entities как пользователи). С учетом этих знаний проблема был довольно быстро найден ([1], [2]): как он оказывается используя DNS-имя (например, "localhost" ) вместо IP (например, '127.0.0.1') вызывает эту проблему.

Простое редактирование файла parameters.yml(изменение localhost на 127.0.0.1) сделал трюк сокращения времени загрузки брандмауэра до минимума.

Ответ 3

Может возникнуть проблема с вашим сервером MySQL. Попробуйте добавить skip-name-resolve в раздел [mysqld] вашего файла my.cnf. Это заставляет MySQL выполнять обратный поиск DNS на IP-адрес входящих соединений.