web-dev-qa-db-ja.com

Symfonyのファイアウォールでこれほど時間がかかるのは何ですか?

私のSymfonyページは遅すぎません(約400ミリ秒でロードされます)が、基本認証を備えた単純なhello worldページであることを考えると、100ミリ秒未満でロードされるはずです。プロファイラーを入力すると、次のように表示されます。

Profiler timeline

250ミリ秒の間は「ファイアウォール」と表示されるだけです。ファイアウォールがユーザーをページの特定の領域に入れないようにする責任があると私は思った-数ミリ秒以上データベースからユーザー情報を取得するのにかかる時間(この場合は61ミリ秒)。

誰かがファイアウォールが実際に何をしているのか説明できますか?ファイアウォールのパフォーマンスを向上させる方法に関する一般的な指針がある場合は、それをいただければ幸いです。


:私はもちろんこれをグーグル化しており、MySQLデータベースにホスト名ではなくIPアドレスで接続していることを前もって指定したい。これは、私が見つけたSymfonyファイアウォールの遅い他のすべてのケースの問題であるように思われました。


関連する可能性のある私のプロジェクトからのいくつかのリソース:

59
Hubro

悲しいかな、それは判明しました Rawdreeg部分的に正しかったです。 MySQLサーバーに接続するのにかかる時間をプロファイルする20行のPHPスクリプトを作成しました:

<?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";

出力は次のとおりです。

接続に230.18503189087ミリ秒かかった
クエリに64.532995223999ミリ秒かかった

Symfonyプロファイラーの空白を完全に埋めます。良いニュースは、私のアプリケーションが稼働すると、ソケットによってローカルでMySQLサーバーに接続するため、おそらく非常に高速になるでしょう!ただし、MySQLサーバーをローカルでミラーリングする以外に、開発中の速度についてできることはほとんどありません。

答えを要約すると、 Symfonyファイアウォールは最初にMySQLデータベースへの接続を作成しますが、私の場合、その接続は非常に低速です。 MySQL接続時間は、私の場合、ファイアウォールのプロファイル時間の80%以上を占めています。


注:私はすでにMySQLサーバーにIPアドレスで接続しており、skip-name-resolveをMySQLの設定に使用しないでください。

9
Hubro

私はググリングをしました、そして this guy があなたの質問に対する答えを持っているようです。

15分の調査の結果、PHP PDOコンストラクターが原因であることがわかりました(私のファイアウォールは、ユーザーとしてエンティティを使用しているため、最初にデータベースに接続するものです)。問題はすぐに見つかりました( [1][2] ):IPではなくDNS名( 'localhost'など)を使用することが判明したため( '127.0.0.1')がこの問題の原因です。

Parameters.ymlファイルを単純に編集(localhostを127.0.0.1に変更)すると、ファイアウォールのロード時間を最小限に抑えることができました。

10
Rawdreeg

MySQLサーバーに問題がある可能性があります。 skip-name-resolveファイルの[mysqld]セクションにmy.cnfを追加してみてください。これにより、MySQLは着信接続のIPアドレスで逆DNSルックアップを実行できなくなります。

0
longneck