PDO 关闭连接

与 MySQLi 相比,PDO 只是一个相当简单的问题。

使用 MySQLi,可以关闭连接:

$this->connection->close();

然而,使用 PDO 时,它声明您使用以下方法打开连接:

$this->connection = new PDO();

而是要关闭连接,您将其设置为 null

$this->connection = null;

这是否正确,这是否真正释放了 PDO 连接?(我知道它是按 null设置的。)我的意思是,使用 MySQLi,你必须调用一个函数(close)来关闭连接。PDO 和 = null一样容易断开吗?还是有关闭连接的函数?

231958 次浏览

根据文档,你是正确的(http://php.net/manual/en/pdo.connections.php) :

连接保持为 激活该 PDO 对象的生存期.To 关闭连接时,需要确保 摧毁目标 所有剩余的对它的引用都会被删除——您可以通过赋值 保存对象的变量为空。如果不这样做 显式地,< strong > PHP 将在您的 脚本结束 .

请注意,如果将 PDO 对象初始化为持久连接,它不会自动关闭连接。

$conn=new PDO("mysql:host=$host;dbname=$dbname",$user,$pass);
// If this is your connection then you have to assign null
// to your connection variable as follows:
$conn=null;
// By this way you can close connection in PDO.

我创建了一个派生类,使其具有一个更加自我记录的指令,而不是 $conn=null;

class CMyPDO extends PDO {
public function __construct($dsn, $username = null, $password = null, array $options = null) {
parent::__construct($dsn, $username, $password, $options);
}


static function getNewConnection() {
$conn=null;
try {
$conn = new CMyPDO("mysql:host=$host;dbname=$dbname",$user,$pass);
}
catch (PDOException $exc) {
echo $exc->getMessage();
}
return $conn;
}


static function closeConnection(&$conn) {
$conn=null;
}
}

所以我可以调用我的代码:

$conn=CMyPDO::getNewConnection();
// my code
CMyPDO::closeConnection($conn);

它不仅仅是将连接设置为 null。这可能是文档所说的,但是对 mysql 来说并非如此。这种连接会持续一段时间(我听说过60年代,但从来没有测试过)

如果您希望在这里看到完整的解释,请参阅关于连接 https://www.php.net/manual/en/pdo.connections.php#114822的注释

要强制关闭连接,您必须执行以下操作

$this->connection = new PDO();
$this->connection->query('KILL CONNECTION_ID()');
$this->connection = null;
<?php if(!class_exists('PDO2')) {
class PDO2 {
private static $_instance;
public static function getInstance() {
if (!isset(self::$_instance)) {
try {
self::$_instance = new PDO(
'mysql:host=***;dbname=***',
'***',
'***',
array(
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4 COLLATE utf8mb4_general_ci",
PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION
)
);
} catch (PDOException $e) {
throw new PDOException($e->getMessage(), (int) $e->getCode());
}
}
return self::$_instance;
}
public static function closeInstance() {
return self::$_instance = null;
}
}
}
$req = PDO2::getInstance()->prepare('SELECT * FROM table');
$req->execute();
$count = $req->rowCount();
$results = $req->fetchAll(PDO::FETCH_ASSOC);
$req->closeCursor();
// Do other requests maybe
// And close connection
PDO2::closeInstance();
// print output

完整示例,带有自定义类 PDO2。