2

PHPでオブジェクトをインスタンス化する際のパフォーマンスとメモリ使用量についてお聞きしたいと思います。

私のアプリケーションのすべてのphpファイルに、データベースに接続するファイルを含めました。

$db->DB::getInstance();
$db->connect('all my credentials');

これは私のdbクラスのgetInstance()関数です。

//singleton database instance
public static function getInstance() {
    if (!self::$Instance) {
        self::$Instance = new DB();
    }

    return self::$Instance;
}

現在、すべてがうまくいっています。しかし、私はパフォーマンスの問題を懸念しています。それは改善できるか、欠陥の可能性などです。

調査したところ、シングルトンインスタンスがメモリの節約に役立つことがわかりました。すでにインスタンス化されている場合は、オブジェクトを再利用します。私は正しいですか?

私の正確な質問は

たとえば、スクリプトにアクセスするユーザーが10人いる場合、オブジェクトが10回インスタンス化されることを意味しますか?それが起こったとき、それは私のメモリ使用量に10倍の負荷をかけますか?->これは私が興味を持っているものです

専門家のアドバイスに感謝します。

4

2 に答える 2

7

すべてのパフォーマンスの調整と同様に、完全に理解していないブードゥーの儀式を盲目的に実行するのではなく、実行していることを測定する必要があります。オブジェクトをに保存すると$_SESSION、PHPはオブジェクトの状態をキャプチャし、そこからファイルを生成します(シリアル化)。次のリクエストで、PHPは新しいオブジェクトを作成し、この状態で再入力します。PHPはディスクI/Oを作成してからシリアル化されたデータを解析する必要があるため、このプロセスはオブジェクトを作成するよりもはるかにコストがかかります。これは、読み取りと書き込みの両方で発生する必要があります。

一般に、PHPはシェアードナッシングアーキテクチャとして設計されています。これには長所と短所がありますが、どういうわけかそれを回避しようとすることは、通常、あまり良い考えではありません。

于 2012-05-07T07:45:19.527 に答える
2

シングルトンを使用しないでください、それはテストを地獄にします。

オブジェクトは、デフォルトで参照としてPHPでシステムの周りに送信されます。したがって、パフォーマンスに影響を与えることなく、システム内の他のクラスでそのデータベース接続オブジェクトを簡単に共有できます(クローンを作成するように特に注文するまで、それらはクローンされません)。

しかし、はい、10人のユーザーがシステムを使用する場合、それはそのクラスの10個のインスタンスを持つことを意味します。また、ユーザーのすべてのリクエストが同時にアクティブになると、メモリ使用量が10倍になることを意味します(通常、負荷とサーバーの設定によっては、一部のリクエストは他のリクエストが完了するまで待機する必要があります)。

PHPとデータベースに持続的接続を使用するように指示することができます。つまり、同じデータベースのユーザー名とパスワードを使用し、同じデータベースに接続する他のスクリプトは、「接続」を共有します。ただし、あるユーザーからの要求により、前のユーザーのデータベースクエリが完了するまで待機しなければならない別のユーザーのエクスペリエンスが低下する可能性があるため、これはほとんど推奨されません。

したがって、要するに、シングルトンを使用しないでください。スマートオブジェクト指向アーキテクチャでは、クラスは子オブジェクトに渡されるか、親から継承されます。これは、クラスを簡単に変更したり、テスト目的でモックアップを簡単に作成したりできることを意味します。

于 2012-05-07T07:49:05.600 に答える