3

データベースクラスでmysqliを拡張しています。親コンストラクターの呼び出しに 2 秒近くかかることに気付きました。展開前にデスクトップで開発しているので、私の環境である可能性があります。しかし、それは私にはあまりありそうにないようです。

環境:

  • OS - Windows 7 プロ
  • WAMP サーバー
  • アパッチ/2.2.17 (Win32)
  • PHP 5.3.4
  • MySql バージョン 5.1.53
  • NetBeans IDE 6.9.1

問題のコード:

class DGMysqliLink extends MySQLi
{
    public function __construct($aDSN)
    {
        // Construct the DSN
        $aDSN['dbhost'] = (empty($aDSN['dbhost']))?ini_get("mysqli.default_host"):$aDSN['dbhost'];
        $aDSN['dbuser'] = (empty($aDSN['dbuser']))?ini_get("mysqli.default_user"):$aDSN['dbuser'];
        $aDSN['dbpass'] = (empty($aDSN['dbpass']))?ini_get("mysqli.default_pw"):$aDSN['dbpass'];
        $aDSN['dbname'] = (empty($aDSN['dbname']))?'':$aDSN['dbname'];
        $aDSN['dbport'] = (empty($aDSN['dbport']))?ini_get("mysqli.default_port"):$aDSN['dbport'];
        $aDSN['dbsock']= (empty($aDSN['dbsock']))?ini_get("mysqli.default_socket"):$aDSN['dbsock'];

        // Instantiate the object by invoking the parent's constructor.
        // This takes nearly 2 seconds
        parent::__construct($aDSN['dbhost'],$aDSN['dbuser'],$aDSN['dbpass'],
                            $aDSN['dbname'],$aDSN['dbport'],$aDSN['dbsock']);

        // If there are any errors, deal with them now
        if($this->connect_error){/* Do some stuff */}
    }
}

このコンストラクターの呼び出しに時間がかかるのはなぜですか?どうすれば修正できますか?

4

2 に答える 2

1

これを修正する方法はありません。単純に、TCP/IP のオーバーヘッドと、相互に通信するクライアント コードとサーバー コードのいくつかのレイヤーが原因です。ただし、永続的な接続を使用できます。これらは PHP 5.3 以降で利用できます。それらをアクティブにするには、接続ステートメントの「p:localhost」のように、ホスト名の前に「p:」を付けます。また、PHP.INI で有効にします: mysqli.allow_persistent = On

それ以外はすべて自動です。

例として、私のページの平均読み込み時間は 1.3 秒でした。メイン ページをロードし、フォーム フィールドに入力するために 4 ~ 5 回の AJAX 呼び出しを行ったところ、この時間はすぐに 7 ~ 8 秒に跳ね上がりました。各 ajax 呼び出しは新しい PHP スクリプトを意味し、それがデータベースへの新しい接続を作成しました。さて、ここでの問題は明らかだと思います。

永続的な接続を使用すると、PHP は既に開いている接続を再利用できるため、スクリプトごとに新しい接続を開いたり閉じたりするのに費やす時間を節約できます。私の場合、接続ごとに約 1 秒が短縮され、パフォーマンスが大幅に向上しました。

ただし、「汚れた」接続が再利用されることによる悪影響については、いくつかの詳細があります。それらはマニュアルで説明されていますが、ここでの短いメッセージは次のとおりです。データベース接続とコマンドを整理し、それらを永続的にします。これは、パフォーマンスが必須の場合に使用する方法です。

于 2013-05-22T02:55:54.657 に答える
0

TCP接続を使用していますか?接続しているホスト名の両方を解決するために DNS の遅延が発生する可能性があり、mysql 側で逆 DNS の遅延が発生する可能性があります。

たとえば、使用している mysql ユーザー アカウントが の場合user@example.com、MySQL は接続元の IP に対して逆引き DNS ルックアップを実行して、example.comその IP アドレスと一致するかどうかを確認する必要があります。

于 2012-05-19T19:36:34.620 に答える