Php PDO:connect as singleton=线程问题?

Php PDO:connect as singleton=线程问题?,php,pdo,thread-safety,Php,Pdo,Thread Safety,因此,我最终开始重构我的PHP office应用程序的基础:我在一个单例PDO类的基础上添加了新的功能,我计划在整个应用程序中部署该类。这是非常直接和有效的(目前),因为它应该: class DB { protected static $instance; protected function __construct() {} public static function getInstance() { if( empty( self::$in

因此,我最终开始重构我的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;
    }
}
今天下午,我告诉我的一个朋友,他是一个.NET程序员,关于这个单例db连接类,他警告我,使用单例连接到数据库可能会导致线程问题

我必须说,这在我脑海中闪过:几个用户将使用该应用程序,几乎所有功能都与(多个)db查询相关。两个用户同时执行一个查询并非不可想象

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


Thx的任何见解

不用担心使用单例建立连接


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

不要担心使用singleton来建立连接


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

Josh Lockhart在

当我们需要确保在web应用程序的整个请求生命周期中只有一个类的实例时,singleton模式非常有用。当我们拥有全局对象(如配置类)或共享资源(如事件队列)时,通常会发生这种情况

因此,如果您请求一个脚本,并且该脚本对数据库进行多个访问(或者调用另一个也访问该数据库的脚本),那么使用Singleton将具有优势。=)
显然,最好通过请求(例如,通过使用存储过程)预先进行多个访问。

Josh Lockhart在

当我们需要确保在web应用程序的整个请求生命周期中只有一个类的实例时,singleton模式非常有用。当我们拥有全局对象(如配置类)或共享资源(如事件队列)时,通常会发生这种情况

因此,如果您请求一个脚本,并且该脚本对数据库进行多个访问(或者调用另一个也访问该数据库的脚本),那么使用Singleton将具有优势。=)
显然,通过请求(例如,通过使用存储过程)预先进行多个访问更好。

这使得PHP中的单例模式相当空洞。谢谢-这证实了我的想法。也许我没有正确地向我的朋友解释这一点,或者PHP与其他编程/脚本语言不同。这使得PHP中的单例模式相当空洞。谢谢-这证实了我的想法。也许我没有向我的朋友正确解释这一点,或者可能PHP与其他编程/脚本语言不同。在PHP中,“单例模式”的实际用途是提供一个延迟加载的全局符号,因为PHP没有线程。PHP有线程,在PHP中,“单例模式”的实际用途是提供一个延迟加载的全局符号,因为php没有线程。php有线程,