PDO关闭连接

时间:2013-08-16 15:42:13

标签: php pdo

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

使用MySQLi,关闭你可以做的连接:

$this->connection->close();

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

$this->connection = new PDO();

但要关闭连接,请将其设置为null

$this->connection = null;

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

5 个答案:

答案 0 :(得分:126)

根据文件你是对的(http://php.net/manual/en/pdo.connections.php):

  

该连接在该PDO对象的生命周期内仍然处于活动状态。至   关闭连接,你需要通过确保销毁对象   所有剩余的引用都将被删除 - 您可以通过分配来完成此操作   对包含该对象的变量为NULL。如果你不这样做   明确地, PHP会在你的时候自动关闭连接   脚本结束

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

答案 1 :(得分:33)

$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.

答案 2 :(得分:4)

我创建了一个派生类,以获得更多自我记录的指令,而不是“$ 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);

答案 3 :(得分:2)

它不仅仅是将连接设置为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;

答案 4 :(得分:-1)

<?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的完整示例。