it-roy-ru.com

Соединения SQL, открытые с PDO в PHP должны быть закрыты

Когда я открываю соединение MySQL в PHP только с помощью встроенных в MySQL функций PHP, я делаю следующее:

$link = mysql_connect($servername, $username, $password);
mysql_select_db($dbname);
//queries etcetera
mysql_close($link);

Когда я открываю соединение с PDO, это выглядит так:

$link = new PDO("mysql:dbname=$dbname;Host=$servername",$username,$password);
//prepare statements, perform queries

Нужно ли явно закрывать соединение, как я это делаю с mysql_connect() и mysql_close()? Если нет, как PHP узнает, когда я закончу с моим соединением?

ТИА.

62
benjy

Используйте $link = null, чтобы сообщить PDO, что он может закрыть соединение.

PHP: PDO-соединения и управление соединениями

При успешном подключении к базе данных экземпляр класса PDO возвращается в ваш сценарий. Соединение остается активным в течение всего времени жизни этого объекта PDO. Чтобы закрыть соединение, вам необходимо уничтожить объект, убедившись, что все оставшиеся ссылки на него удалены - вы делаете это, присваивая NULL переменной, которая содержит объект. Если вы не сделаете это явно, PHP автоматически закроет соединение, когда ваш скрипт завершится.

76
DreadPirateShawn

PDO не предлагает такую ​​функцию самостоятельно. Соединения через PDO управляются косвенно через счетчик объектов PDO в PHP.

Но иногда вы все равно хотите закрыть соединение, независимо от пересчета. Либо потому, что вы не можете контролировать его, нужно это для целей тестирования или тому подобное.

Вы можете закрыть соединение Mysql с 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:

Связанные вопросы Stackoverflow:

13
hakre

По завершении выполнения скрипта PHP все соединения закрываются. Также вам не нужно явно закрывать соединение с помощью mysql_close().

11
Vexatus

Вы также можете ограничить свои соединения с помощью местных функций. Таким образом, соединение закрывается, как только функция завершается.

5
JDelage

Хорошо видно, что $link для PDO назначен объект, PHP установит для него значение null, как только сценарий будет запущен, чтобы он больше не был объектом. Поэтому вы можете просто сделать:

$link = new PDO("mysql:dbname=$dbname;Host=$servername",$username,$password);

//prepare statements, perform queries

$link = null;
1
Rob Holland

http://uk3.php.net/pdo

Из того, что я понял, я никак не мог закрыть его в руководстве по php, и примеры скриптов, на которые я быстро посмотрел, никогда не закрывали соединение в любом случае из того, что я мог видеть.

0
pjanaway