Нужно ли закрывать соединения SQL, открытые с помощью PDO в PHP? - PullRequest
62 голосов
/ 26 июня 2009

Когда я открываю соединение 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 узнает, когда я закончу с моим соединением?

ТИА.

Ответы [ 6 ]

76 голосов
/ 26 июня 2009

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

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

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

13 голосов
/ 01 января 2013

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:

11 голосов
/ 26 июня 2009

Когда PHP-скрипт завершает работу, все соединения закрываются. Также вам не нужно явно закрывать ваше соединение с mysql_close().

5 голосов
/ 28 октября 2010

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

1 голос
/ 05 июля 2013

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

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

//prepare statements, perform queries

$link = null;
0 голосов
/ 26 июня 2009

http://uk3.php.net/pdo

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...