PDO关闭连接

Lia*_*sby 107 php pdo

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

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

$this->connection->close();
Run Code Online (Sandbox Code Playgroud)

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

$this->connection = new PDO();
Run Code Online (Sandbox Code Playgroud)

但要关闭您设置的连接null.

$this->connection = null;
Run Code Online (Sandbox Code Playgroud)

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

Kie*_*ran 133

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

该连接在该PDO对象的生命周期内保持活动状态.要关闭连接,您需要通过确保删除对它的所有剩余引用来销毁对象 - 您可以通过为保存对象的变量赋值来执行此操作.如果您没有明确地执行此操作,PHP将在脚本结束时自动关闭连接.

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

  • 如果我的流程没有结束怎么办?例如websocket.有没有办法不使用持久连接? (3认同)
  • @tonix 我认为是的,是的。引用自 [PHP 持久连接手册](http://se2.php.net/manual/en/features.persistent-connections.php):**“**警告** 还有一些额外的警告要注意使用持久连接时要记住。一是在持久连接上使用表锁定时,如果脚本由于某种原因无法释放锁定,那么使用相同连接的后续脚本将无限期阻塞,可能需要您重新启动httpd服务器或数据库服务器。”* (2认同)

小智 37

$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.
Run Code Online (Sandbox Code Playgroud)

  • PDO上应该有一个 - > close()方法. (30认同)
  • 恕我直言,我认为这是一个非常糟糕的模式,特别是当开发人员可能存储pdo引用的几个副本时.$ a =新PDO(...); $ b = $ a; $ a = null; 在那里,您的PDO对象将永远保持打开状态(在类似守护进程的php程序中).当PDO引用跨越函数和对象属性时,尤其如此,并且您永远不会确定将所有这些属性置空. (10认同)
  • 不喜欢PDO的另一个原因. (4认同)
  • @Gabriel - 我建议"存储几个副本"是一个更糟糕的模式. (4认同)
  • 如果您在这两行之间创建了一个PDOStatement对象(即在每种实际情况下),则这不起作用.要关闭连接,必须将PDO对象和PDOStatement对象都设置为null.见这里:http://php.net/manual/en/pdo.connections.php#114822 (3认同)
  • 我们在 2018 年,我在 PDO 关闭连接方面遇到了麻烦,因为 PHP 核心开发人员的“聪明人”有一个绝妙的主意,即 ->close() 方法到 PDO 是一个“坏主意”:D (3认同)

Jda*_*ern 15

它不仅仅是将连接设置为空。这可能是文档所说的,但这不是 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;
Run Code Online (Sandbox Code Playgroud)


Fil*_*Fil 8

我创建了一个派生类来拥有更多的自记录指令而不是$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;
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我可以在以下之间调用我的代码:

$conn=CMyPDO::getNewConnection();
// my code
CMyPDO::closeConnection($conn);
Run Code Online (Sandbox Code Playgroud)