Использование закрытия соединения с базой данных в php

Я всегда предполагал, что это всегда хорошая практика, чтобы закрыть соединение с базой данных, независимо от базы данных/ORM, как mysql_close (), Propel::close() и т. д.

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

однако я нахожу эти ответы немного трудно переварить. Причина в том, почему все DB lib, ORM предоставляют метод close? Если он там,в каждом ORM / lib, должно быть какое-то хорошее использование.

может ли кто-нибудь пролить свет на то, при каких обстоятельствах мы должны использовать метод close для закрытия соединения DB? & если эти методы вообще не полезны, почему они присутствуют во всех DB libs / ORM?

редактировать

Мой Вывод

Это был хорошая дискуссия между Bondye и Fluffeh, и это очистило мои сомнения относительно использования закрытия соединения. Благодаря им обоим.

  • если ожидается, что ваш скрипт будет длиться менее 100 мс, не беспокойтесь о закрытии соединения.
  • BUT: если ожидается, что скрипт будет длиться дольше, и есть некоторое время между последней операцией БД и закрытием скрипта, свободное соединение для других, вызвав *close().

Мне действительно очень трудно принять один ответ, поскольку оба ответа верны на своем месте. Просто принимая ответ со всеми комментариями, чтобы он оставался сверху. Но +1 к обоим правильным ответам.

4 ответов


используя mysql_close() обычно не требуется, так как непостоянные открытые ссылки автоматически закрываются в конце выполнения скрипта.

высвобождение ресурсов

благодаря системе подсчета ссылок, введенной с движком Zend PHP 4, ресурс без дополнительных ссылок на него обнаруживается автоматически, и он освобождается сборщиком мусора. По этой причине редко бывает необходимо освобождать память вручную.

надеюсь, это поможет вам больше.

(источник)

edit:

цель mysql_close() также сохранить ресурсы компьютера, но другая ключевая причина для использования его потому что ограниченное число соединений которые сервер MySQL может принять, и если вы имеете несколько клиентов держа соединения открытыми без причины, то сервер может хорошо повернуть прочь другие, ожидая клиенты. Естественно это плохо дело, так, как с mysql_free_result(), хорошо позвонить mysql_close() Если вы думаете, что будет некоторое время между вашим последним использованием базы данных и окончанием сценария.


это всегда хорошая практика, чтобы закрыть подключение к базе данных, когда вам больше не нужно. Даже если он закрывается автоматически после завершения сценария - это может быть еще секунда или несколько секунд спустя. Если вам это больше не нужно, один пользователь нажимает на страницу и тратит соединение с базой данных на полсекунды, это не имеет значения , но двадцать сразу-это внезапно 10 секунд открытого соединения - и это тут сделать разницу.

в в то же время повторное использование соединения может быть хорошей практикой-создание и открытие соединения обычно занимает по крайней мере несколько миллисекунд - и если вы, например, вставляете несколько сотен тысяч строк, эти несколько миллисекунд каждый раз складываются очень быстро.

в некотором смысле, это ничем не отличается от установки переменной в NULL или ее сброса. Вы не есть сделать это, но чистый элегантный код и управление ресурсами всегда хорошая вещь.


подключения к базе данных не являются неограниченными. Программное обеспечение коммерческих баз данных, особенно, часто имеет лицензии, которые ограничивают количество одновременных подключений относительно небольшим числом. В такой ситуации вы определенно хотите закрыть соединение, когда ваш скрипт больше не используется активно. Хотя PHP автоматически закрывает соединение с базой данных, когда скрипт завершается, он не делает этого, пока посетитель не закончит загрузку страницы. Если его соединение медленное (dial-up или mobile), это может занять десять, двадцать секунд для всего, что вы знаете.


хорошо развитая доктрина ORM и Propel хороши при закрытии соединений MySQL. Но если вы используете прямой php, я видел много проблем с базой данных, отслеживаемых до незамкнутых соединений. Разумно закрыть все подключения к БД в конце каждого скрипта.