61

私の Symfony ページはそれほど遅くはありません (約 400 ミリ秒で読み込まれます) が、基本認証を使用した単純な Hello World ページであることを考慮すると、100 ミリ秒未満で読み込まれるはずです。プロファイラーに入ると、次のように表示されます。

プロファイラーのタイムライン

250 ミリ秒間「ファイアウォール」とだけ表示されていることに注意してください。ファイアウォールは、ユーザーをページの特定の領域から遠ざける役割を担っているだけだと思っていました。データベースからユーザー情報を取得するのにかかる時間と、数ミリ秒以上かかるとは思えません (この場合は61ミリ秒)。

誰かがファイアウォールが実際に何をするのか説明できますか? ファイアウォールのパフォーマンスを向上させる方法についての一般的な指針があれば、それは大歓迎です.


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


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

4

3 に答える 3

13

グーグルで調べたところ、この男があなたの質問に答えているようです。

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

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

于 2013-04-24T06:52:08.200 に答える
11

残念ながら、 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% 以上を占めています。


注:既に IP アドレスで MySQL サーバーに接続しておりskip-name-resolve、MySQL 構成に追加しても無駄です。

于 2013-04-25T20:19:29.990 に答える
1

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

于 2013-04-25T14:30:48.613 に答える