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(在家的测试环境))能够处理这个?也许为每个用户提供了一个新实例?也许我应该将这个单例与将为每个查询/更新/插入/删除锁定数据库的事务一起使用以避免线程问题?或许我的朋友错了,我不必担心?
感谢任何见解!
不要担心使用单例来建立连接.
每个PHP脚本请求都有自己的线程.我的意思是,如果同时发生两个请求,Web服务器将在两个不同的线程中执行您的单例,因此您最终将有两个不同的对象处理数据库连接.