Что делает брандмауэр Symfony, который занимает так много времени?


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

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

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


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


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

3 55

3 ответа:

Я немного погуглил и вижу, что этот парень, Кажется, ответ на ваш вопрос.

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

простое редактирование параметров.YML файл (изменение localhost на 127.0.0.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 конфигурация безрезультатно.

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