php - 具有扩展 PDOStatement 的 PDO 在设置 NULL 时无法断开连接

标签 php mysql connection pdo

在 PHP 5.5.22 和 5.5.25 中测试

当使用扩展了 PDOStatement 的 PDO 时,MySQL 会保持连接直到 PHP 脚本完成。

use PDO;

$dbinfoCode = array(
    'userid' => 'userid',
    'password' => 'password',
    'engine' => 'mysql',
    'host' => '192.168.100.2',
    'database' => 'test',
);


for ($i = 0; $i < 10000; $i++) {

    $dsn = sprintf("%s:host=%s;dbname=%s", $dbinfo['engine'], $dbinfo['host'], $dbinfo['database']);

    $pdo = new PDO($dsn, $dbinfo['userid'], $dbinfo['password'], $options);
    $pdo->setAttribute (PDO::ATTR_STATEMENT_CLASS, array ('PDOStatement2', array($pdo)));
    $pdo = null;

}

class PDOStatement2 extends PDOStatement {
}

我可以看到 MySQL 查询上越来越多的“ sleep ”进程。最后,MySQL 抛出错误“Too Many Connections”。

SHOW PROCESSLIST;

如果没有关于PDO::ATTR_STATMENT_CLASS的setAttribute,MySQL连接会按正常顺序断开。

    $pdo = new PDO($dsn, $dbinfo['userid'], $dbinfo['password'], $options);
    //$pdo->setAttribute (PDO::ATTR_STATEMENT_CLASS, array ('PDOStatement2', array($pdo)));
    $pdo = null;

我不知道这是一个错误还是有其他解决方案。

最佳答案

终于,我找到了解决方案。

以下语句中的 $pdo 对象将被复制

$pdo->setAttribute (PDO::ATTR_STATEMENT_CLASS, array ('PDOStatement2', array($pdo)));

使用&$pdo而不是$pdo

$pdo->setAttribute (PDO::ATTR_STATEMENT_CLASS, array ('PDOStatement2', array(&$pdo)));

关于php - 具有扩展 PDOStatement 的 PDO 在设置 NULL 时无法断开连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32389009/

相关文章:

java - 自定义 IBM MQ 的自动重新连接设置

php - 寻求有关在 CodeIgniter 中加入查询的帮助

php - 如何对sql表中的数据进行编码?

network-programming - 检查 WebRTC 连接 - 可靠的方法

mysql - Grails 2.3.0 和 mysql 连接超时

php - 将统计数据保存在 MySQL 数据库中以绘制折线图

Android连接服务器ip和端口

php - 读取字段,使其在 pimcore CMS 中不可编辑,因为响应性导致重复字段

javascript - 防止多次执行JS函数/表单提交

php - SMS 和 PHP...还有 Google Voice?