2013-04-19 1 views
53

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

Profiler timeline

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

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


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


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

+1

Я бы предположил, что выполняет все правила в security.yml, разделы управления провайдерами, acess и брандмауэрами могут стать довольно неприятными, проверка всех этих запросов на каждый запрос занимает много времени. –

+0

@ xr09: 251 мс * действительно * долгое время (в компьютерное время). Я не вижу никакого способа просто прочитать кэшированную конфигурацию и применить ее к контексту безопасности, может зайти так близко. – Hubro

+0

Я только что заметил, ваш «Astrups/SpectacleBundle/Entity/User.php» нарушает принцип «Single Responsibility» **. – Yang

ответ

8

Увы, оказывается 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 не дало никаких результатов.

+0

У меня есть приложение, которое не настроено на использование базы данных, то же самое. Я не думаю, что это настоящая причина. – guice

+0

@guice Это было в моем случае. – Hubro

8

I ди d некоторый googling и я вижу что this guy, кажется, имеет ответ на ваш вопрос.

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

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

+0

Для получения информации, [лучше] (http://meta.stackexchange.com/q/8259) включить основные части ответа здесь и предоставить ссылку для справки. Поскольку целевой ресурс не гарантированно будет жить в будущем. – j0k

+4

Я четко указал в своем вопросе, что это ** не ** проблема. Проверьте ** Примечание: ** часть. – Hubro

0

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

+0

Спасибо за предложение, я проверю это. Но не подключался бы к MySQL перейти под «Doctrine» в профилировщик? – Hubro

+0

Не знаю. Я просто перешел к цитате из ответа Rawdreeg, что подразумевает, что компонент брандмауэра открывает соединение с базой данных. – longneck

+0

К сожалению, это не помогло. Ваш ответ подсказывал мне написать скрипт, чтобы определить время соединения, хотя это, в свою очередь, ответило на мой вопрос. – Hubro