我有一个PDO的单例类,下面是类的相关部分
public static function getInstance( $config )
{
if ( ! isset(self::$instance))
self::$instance = new self( $config );
return self::$instance;
}
public function __construct( $config )
{
self::$start = self::timer();
try
{
$host = $config['host'];
$dbname = $config['name'];
$user = $config['user'];
$password = $config['password'];
self::$objInstance = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8",
"$user",
"$password",
array(PDO::ATTR_PERSISTENT => true)
);
self::$objInstance -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
}
catch (PDOException $e)
{
//need to log for security
die('PDO CONNECTION ERROR: ' . $e->getMessage() . '<br/>');
}
}
public static function closeConnection ( )
{
try
{
self::$objInstance = null;
}
catch (PDOException $e)
{
//OPTIMIZE**************************** to do
//file_put_contents("log/dberror.log", "Date: " . date('M j Y - G:i:s') . " ---- Error: " . $e->getMessage().PHP_EOL, FILE_APPEND);
die($e->getMessage());
}
self::$end = self::timer();
}
所以这里一切正常,但是当我在任何数据库操作之后调用静态closeConnection()
时,它会使PDO实例为空,这很好但是再次调用PDO实例会产生错误,因为PDO现在为空调用closeconnection。我的问题是如何处理在单件类中关闭PDO?
答案 0 :(得分:1)
更改
self::$objInstance = null;
到
self::$instance = null;
因为您尝试删除PDO对象而不是单例对象。
答案 1 :(得分:0)
成功连接数据库后,PDO的一个实例 class返回到您的脚本。连接仍然有效 该PDO对象的生命周期。要关闭连接,您需要 通过确保对它的所有剩余引用来销毁对象 已删除 - 您可以通过将
NULL
分配给包含该变量的变量来执行此操作 宾语。 如果您没有明确地执行此操作,PHP将自动关闭 脚本结束时的连接。
使用单身人士,连接的整个生命周期应该由单身人士自己控制。因此,我将依赖于记录的自动关闭连接,而不是公开一个方法来完全关闭连接(出于同样的原因,不应该暴露构造函数)。