PDO с расширенным PDOStatement не может отключить соединение, если установлено NULL

Протестировано в PHP 5.5.22 и 5.5.25

При использовании PDO с расширенным PDOStatement 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 {
}

Я вижу все более сложенные процессы "Sleep" в запросе MySQL. Наконец, MySQL выдает ошибку "Слишком много соединений".

SHOW PROCESSLIST;

Если нет setAttribute о PDO::ATTR_STATEMENT_CLASS, MySQL соединение отключено в рабочем состоянии.

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

Я понятия не имею об этом, является ли это ошибкой или есть другие решения.

1 ответ

Решение

Наконец-то я нашел решение.

Объект $pdo в следующей инструкции будет дублирован

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

использование &$pdo вместо $pdo,

$pdo->setAttribute (PDO::ATTR_STATEMENT_CLASS, array ('PDOStatement2', array(&$pdo)));
Другие вопросы по тегам