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

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

$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 знает, когда я закончил с моим подключением?

ТИА.

Ответ 1

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

PHP: PDO Connections и управление подключением

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

Ответ 2

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

Ответ 3

PDO не предлагает такую ​​функцию самостоятельно. Подключения через PDO косвенно управляются с помощью PDO-объектов refcount в 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:

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

Ответ 4

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

Ответ 5

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

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

//prepare statements, perform queries

$link = null;

Ответ 6

http://uk3.php.net/pdo

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