PDO:连接为singleton =线程问题?

zen*_*ord 1 php pdo thread-safety

所以我最终开始重构我的PHP office应用程序的基础:我基于单例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;
    }
}
Run Code Online (Sandbox Code Playgroud)

今天下午我告诉我的一个朋友,他是一个关于这个单例db-connection类的.NET程序员,他警告我使用单例连接到数据库会导致线程问题.

我必须说它已经超出我的想法:几个用户将使用该应用程序,几乎所有功能都与(多个)db-queries相关.两个用户同时执行查询并不是不可想象的.

PDO(或PHP,或Apache(在办公室),或Nginx(在家的测试环境))能够处理这个?也许为每个用户提供了一个新实例?也许我应该将这个单例与将为每个查询/更新/插入/删除锁定数据库的事务一起使用以避免线程问题?或许我的朋友错了,我不必担心?

感谢任何见解!

jap*_*968 5

不要担心使用单例来建立连接.

每个PHP脚本请求都有自己的线程.我的意思是,如果同时发生两个请求,Web服务器将在两个不同的线程中执行您的单例,因此您最终将有两个不同的对象处理数据库连接.

  • 这使得PHP中的Singleton模式相当无聊. (2认同)