0

私の理解が正しいかどうか疑問に思っています。

データベース接続パラメーターを に配置しました。__construct()つまり、クラスがインスタンス化されるたびに、データベースにも再接続しますよね?

private $handle;
public function __construct()
{
  $username = "test";
  $password = "9712nc*<?12";
  $host = "localhost";
  $db = "miner";
  $dsn = 'mysql:dbname='.$db.';host='.$host;
  try {
    $this->handle = new PDO($dsn,$username,$password);
  }
  catch(PDOException $e) {
    print $e->getMessage();
    die();
  }
}

特定のユーザーから多くのリクエストがある場合、これは良い方法ですか? これは、ユーザーがリクエストを行うたびに (リクエストが数分前に行われた場合でも)、スクリプトは最初にデータベースに接続する必要があるということですか? 保存できる適切な方法はあります$handleか?

ところで:データベース接続は正常に動作しています。

4

2 に答える 2

1

クラスが一度インスタンス化されれば、問題はありません。この場合、1つの接続のみを開きます。

クラスを数回インスタンス化する場合、または静的クラスとして使用する場合は、毎回接続を作成する可能性がありますが、これは理想的ではありません。

クラスをすべてアクティブにしておくと(つまり、作成したクラスへの参照をメモリから削除することはありません(私はテストしたことがありません)、PHPの内部で実際にこれを整理する必要がありますが、それでもデータベースへの1つの接続。ただし、作成したクラスへのハンドルを失った場合、PDOは破棄され、再開します。静的クラスとして使用している場合(つまり、で呼び出す場合class:function())、次のようになります。間違った道を進んでいます。


2つの一般的な解決策があり、両方に賛成と反対の議論があります。

1)DB接続を保存するためにグローバルを使用します。$ handle = PDOを作成し、$handleをグローバル変数として格納します。簡単に回すことができます。上書きしやすい-ここでは議論しません。

2)思い出す「静的」クラス(一般にシングルトンと呼ばれる)を作成します。基本的な構造は

private static $ThisObj;
private static $handle;

public static function getInstance() {
    if( !(self::$ThisObj instanceof SoapDB) ) {
        self::$ThisObj = new SoapDB();
        try {
            $this->handle = new PDO_Handler('mysql:dbname=' . DB_NAME . ';host=' . DB_HOST, DB_USER, DB_PASS);
            $this->handle->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch (PDOException $e) {
            // Error Here
        }
    }
    return self::$ThisObj;
}

これを使用すると、通常、シングルトンとして個別のDBクラスを作成します。シングルトンvsグローバルの使用:あなたの呼び出し(調査後)。

3)3番目の答えは、上記のクラスを静的なものとしてのみ呼び出している場合(つまり、呼び出している場合class::function())、$ handleを静的なものとして作成するだけで、実際に問題を驚くほど解決する必要があります。基本的に、データベースをプロパティの1つとして、シングルトンを作成しています。

間違った答えや正しい答えはありません。


コメント「静的クラスとは」に基づいて編集します。

厳密に言えば、「静的プロパティを持つクラス」と言うべきです。説明すると、通常、次の構文でクラスを作成します。

$myClass = new class();
$methodResult = $myClass->method();

$myClass次に、関数を呼び出すことで、気の利いた小さなことをたくさん行います。その後、クラスへの参照を削除し、プロパティ(変数)を失い、後で再開することができます。

静的クラス(この回答の目的のため)は、静的プロパティを持つクラスです。通常(絶対ではありませんが)行くことによって呼び出されます。

$methodResult = class::method();

あなたはクラスに固執しません-それは開始され、使用され、そして落とされます。ただし、プロパティ(s)を静的として保存varすると、そのクラスを使用するたびに、それらのプロパティは最後の状態のままになります。method設定できますが$this->MyVar = 'something'、次回は$this->MyVarがまだ何かになります。

コードをコンパートメント化するのに非常に便利で、関数が他の関数を上書きするのを防ぎ、単体テストを簡単にすることができます。

(注-私はそれを単純にするために一般化しています。しかし、それはあなたにプロセスのアイデアを与えるはずです。)

于 2012-11-09T05:58:52.023 に答える
0

シングルトンを使用する必要があります。google 'mysql php singleton' を試してみてください。

http://www.swhistlesoft.com/blog/2011/08/05/1435-mysql-singleton-class-to-allow-easy-and-clean-access-to-common-mysql-commands

于 2012-11-09T06:01:23.753 に答える