gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 02:20:41 29 4
gpt4 key购买 nike

在 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 查询中看到越来越多的“休眠”进程。最后,MySQL 抛出错误“连接太多”。

SHOW PROCESSLIST;

如果没有关于 PDO::ATTR_STATEMENT_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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com