Вопрос по pdo, php, mysql, sql – Нужно ли закрывать соединения SQL, открытые с помощью PDO в PHP?
Когда я открываю соединение MySQL в PHP только с помощью встроенных в MySQL функций PHP, я делаю следующее:
<code>$link = mysql_connect($servername, $username, $password); mysql_select_db($dbname); //queries etcetera mysql_close($link); </code>
Когда я открываю соединение с PDO, это выглядит так:
<code>$link = new PDO("mysql:dbname=$dbname;host=$servername",$username,$password); //prepare statements, perform queries </code>
Должен ли я явно закрыть соединение, как я делаю сmysql_connect()
а такжеmysql_close()
? Если нет, как PHP узнает, когда я установил соединение?
ТИА.
$link
поскольку PDO назначен объект, PHP установит его как нулевое, как только сценарий будет запущен, чтобы он больше не являлся объектом. Поэтому вы можете просто сделать:
$link = new PDO("mysql:dbname=$dbname;host=$servername",$username,$password);
//prepare statements, perform queries
$link = null;
правляются косвенным образом через счетчик объектов PDO в PHP.
Но иногда вы все равно хотите закрыть соединение, независимо от пересчета. Либо потому, что вы не можете контролировать его, нужно это для целей тестирования или тому подобное.
Вы можете закрытьMysql connection with PDO запустив запрос SQL. Каждый пользователь, который может подключиться к серверу Mysql, можетKILL
по крайней мере, свой собственный поток:
/*
* Close Mysql Connection (PDO)
*/
$pdo_mysql_close = function (PDO $connection) {
$query = 'SHOW PROCESSLIST -- ' . uniqid('pdo_mysql_close ', 1);
$list = $connection->query($query)->fetchAll(PDO::FETCH_ASSOC);
foreach ($list as $thread) {
if ($thread['Info'] === $query) {
return $connection->query('KILL ' . $thread['Id']);
}
}
return false;
};
$pdo_mysql_close($conn);
Связанная документация Mysql:
13.7.5.30.SHOW PROCESSLIST
Syntax
13.7.6.4. KILL
Syntax
Связанные вопросы Stackoverflow:
PHP PDO close()? (Apr 2012)$connection->query('KILL CONNECTION_ID();');
Протестировано на mysql 5.7 на debian из локального клиента командной строки mysql и из рабочей среды на рабочей станции Windows. В соответствии сdev.mysql.com/doc/refman/5.5/en/show-processlist.html столбец ПОКАЗАТЬ ПРОЦЕССId
является & quot; ... идентификатором соединения. Это значение того же типа, которое отображается в столбце ID таблицы INFORMATION_SCHEMA PROCESSLIST и возвращаетсяCONNECTION_ID()
. Функция & Quot; (примечание: я комментирую ответ, которому почти 6 лет)
$link = null
сообщить PDO, что может закрыть соединение.
PHP: PDO Connections & amp; Управление подключением
Upon successful connection to the database, an instance of the PDO class is returned to your script. The connection remains active for the lifetime of that PDO object. To close the connection, you need to destroy the object by ensuring that all remaining references to it are deleted--you do this by assigning NULL to the variable that holds the object. If you don't do this explicitly, PHP will automatically close the connection when your script ends.
mysql_close()
не используется в конце скрипта (или в__destruct()
вашего класса БД)? Из руководства это звучит так, как будто объект PDO разрушен, соединение также закрывается. Важно из-за этого:stackoverflow.com/a/2960656/372654, Кажется, так из исходного кода PDO, но ...
unset()
объект PDO вместо установки его в NULL? Я действительно хочу получить разъяснения по этому поводу!