Вопрос по pdo, php, mysql, sql – Нужно ли закрывать соединения SQL, открытые с помощью PDO в PHP?

62

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

ТИА.

Ваш Ответ

6   ответов
1

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

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

//prepare statements, perform queries

$link = null;
11

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

5

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

13

правляются косвенным образом через счетчик объектов 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 лет)
76

$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.

Интересно, PDO dtor явно закрывает соединение или оставляет это PHP так же, как это происходит, когдаmysql_close() не используется в конце скрипта (или в__destruct() вашего класса БД)? Из руководства это звучит так, как будто объект PDO разрушен, соединение также закрывается. Важно из-за этого:stackoverflow.com/a/2960656/372654, Кажется, так из исходного кода PDO, но ...
Как насчет сферы? Если объект соединения создается и не возвращается в конце функции / метода, то умрет ли соединение?
Стоит отметить, что в официальном руководстве по PHP (по ссылке выше) рекомендуется установить значение null и не упомянуть "unset ()". У вас проблемы с использованием официального подхода или вы спрашиваете академически? Если первое, пожалуйста, уточните детали. Если последнее, возможно, вы захотите обратиться к разработчикам PHP, они лучше всего подойдут для решения альтернатив их официально документированному решению. (Например, даже если unset () работает в одной версии, она может не работать в другой, если разработчики явно не обеспечивают такой подход.)
ИМХО, это не имеет значения, если вы unset () или установлены в NULL. AFAIK, в любом случае метод destruct PDO :: __ вызывается так же, как если бы вы позволили переменной длиться до конца сценария, и соединение в этом методе закрывается.
Не одинunset() объект PDO вместо установки его в NULL? Я действительно хочу получить разъяснения по этому поводу!
0

http://uk3.php.net/pdo

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

Похожие вопросы