Когда я открываю соединение 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 знает, когда я закончил с моим соединением?
ТИА.
Используйте $link = null
чтобы PDO знал, что может закрыть соединение.
PHP: подключения и управление PDO
После успешного подключения к базе данных экземпляр класса PDO возвращается в ваш скрипт. Соединение остается активным для времени жизни этого объекта PDO. Чтобы закрыть соединение, вам нужно уничтожить объект, убедившись, что все остальные ссылки на него удалены – вы делаете это, назначая NULL переменной, которая содержит объект. Если вы не сделаете это явно, PHP автоматически закроет соединение, когда ваш скрипт закончится.
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:
SHOW PROCESSLIST
KILL
Связанные вопросы о стеке:
Когда скрипт PHP завершит выполнение, все соединения будут закрыты. Также вам не нужно явно закрывать соединение с mysql_close()
.
Вы также можете ограничить свои подключения локальными функциями. Таким образом, соединение закрывается, как только функция будет завершена.
Хорошо видя, что $link
для PDO назначается объекту, PHP будет устанавливать это как null, как только скрипт будет запущен, так что он больше не является объектом. Поэтому вы можете просто сделать:
$link = new PDO("mysql:dbname=$dbname;host=$servername",$username,$password); //prepare statements, perform queries $link = null;
Из того, что я собираю, я не мог все равно закрыть его в руководстве по php, и примеры сценариев, которые я быстро посмотрел, никогда не закрывали соединение, в любом случае, из того, что я мог видеть.