140

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

使用 MySQLi,要关闭连接,您可以执行以下操作:

$this->connection->close();

但是,对于 PDO,它声明您使用以下方式打开连接:

$this->connection = new PDO();

但是要关闭您将其设置为的连接null

$this->connection = null;

这是正确的吗?这实际上会释放 PDO 连接吗?(我知道它设置为null。)我的意思是使用 MySQLi 你必须调用一个函数 ( close) 来关闭连接。PDO 是否像断开连接一样容易= null?还是有关闭连接的功能?

4

5 回答 5

160

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

该连接在该 PDO 对象的生命周期内保持活动状态。要关闭连接,您需要通过确保删除对它的所有剩余引用来销毁该对象——您通过将 NULL 分配给保存该对象的变量来做到这一点。如果您没有明确地这样做,PHP 将在您的脚本结束时自动关闭连接

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

于 2013-08-16T15:47:12.617 回答
54
$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.
于 2015-06-09T03:15:54.597 回答
18

它不仅仅是将连接设置为空。这可能是文档所说的,但这不是 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;
于 2019-08-15T16:02:45.813 回答
9

我创建了一个派生类来拥有更多自文档说明,而不是$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);
于 2017-05-24T00:18:29.270 回答
0
<?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。

于 2020-02-13T08:44:02.250 回答