1

そこで、ようやく PHP オフィス アプリのベースのリファクタリングを開始しました。シングルトン PDO クラスに基づいて新しい機能を追加し、アプリ全体に展開する予定でした。それは非常に簡単で、(今のところ)機能しています。

class DB {

    protected static $instance;
    protected function __construct() {}
    public static function getInstance()
    {

        if( empty( self::$instance ) )
        {
            $dsn =  'pgsql:host=' . Config::$a .
                    ';dbname='    . Config::$b .
                    ';port='      . Config::$c .
                    ';connect_timeout=15';            
            $db_user = Config::$d;             
            $db_pass = Config::$e;

            try
            {
                self::$instance = new PDO( $dsn, $db_user, $db_pass );
                self::$instance->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
            }  
            catch( PDOException $e )
            {  
                new Log( 6, "DB Class failed to connect to dbase: $e" );
            }                          
        }
        return self::$instance;
    }
}

今日の午後、このシングルトン db-connection クラスについて .NET プログラマーである私の友人に話しています。彼は、シングルトンを使用してデータベースに接続すると、スレッド化の問題が発生する可能性があると警告しています。

何人かのユーザーがアプリを使用し、ほとんどすべての機能が (複数の) db-queries に関連しています。2 人のユーザーが同時にクエリを実行することは考えられません。

PDO(またはPHP、またはApache(オフィス)、またはNginx(自宅のテスト環境))はこれに対処できますか?たぶん、すべてのユーザーに新しいインスタンスが与えられますか? スレッドの問題を回避するために、クエリ/更新/挿入/削除ごとにデータベースをロックするトランザクションと一緒にこのシングルトンを使用する必要がありますか? それとも、私の友人が間違っているので、心配する必要はありませんか?

洞察のためのThx!

4

2 に答える 2

6

シングルトンを使用して接続を確立することについて心配する必要はありません。

すべての php スクリプト リクエストには、独自のスレッドがあります。つまり、2 つの同時リクエストが発生した場合、Web サーバーは 2 つの異なるスレッドでシングルトンを実行するため、最終的にデータベース接続を処理する 2 つの異なるオブジェクトが作成されます。

于 2013-01-27T20:11:08.680 に答える