Важно ли закрытие соединения mysql?


88

Важно ли закрывать эффективность соединений mysql, или она автоматически закрывается после запуска файла php?


См. Также этот вопрос stackoverflow.com/questions/336078/…
Alex

Полагаю, то же самое относится и к ftp_close?
doc_id

Важно ли закрытие соединения mysql? да, это похоже на деструктор в C ++
jasinth premkumar

Ответы:


89

Из документации :

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

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

Я не уверен, как fastcgi влияет на вещи. На одной странице утверждается, что сборка PHP, поддерживающая fastcgi, будет создавать постоянные соединения даже для mysql_connect. Это противоречит документации в том смысле, что соединение закрывается при завершении процесса, а не сценария. Вместо тестирования я рекомендую использовать mysql_close (). Собственно, я рекомендую использовать PDO , если он доступен.


Полагаю, то же самое относится и к ftp_close?
doc_id

4
Означает ли это, что если пользователь закроет страницу (например) раньше (или возникнет ошибка), соединение может остаться открытым?
Тони Мишель Каубет

1
@Toni Michel Caubet "The link to the server will be closed as soon as the execution of the script ends."Когда пользователь закрывает страницу раньше, это не имеет значения для сервера PHP. Он запускает сценарий как всегда и завершает сценарий как всегда. Только пользователь не увидит результата.
arrowman

9

Это важно? Не так много

Считается ли это хорошей практикой? Да.

Я не понимаю, почему вы не хотите его закрыть.


6
Что ж, учитывая, что даже на странице руководства для mysql_closeнаписано: «Использование mysql_close () обычно не требуется, поскольку непостоянные открытые ссылки автоматически закрываются в конце выполнения скрипта». Я бы не стал считать плохой практикой не закрывать соединение.
Нико

4
«Я не понимаю, почему вы не хотите его закрыть». Вы бы не захотели закрыть его, если есть шанс, что он вам снова может понадобиться.
Фрэнк Фармер,

1
если U использует ajax, то если соединение закрыто, то каждый раз, когда U пытается использовать ajax, соединение будет открываться и закрываться снова, и это будет стоить того, чтобы оставить соединение открытым для сервера, и клиент не заботится об открытом соединении или нет заботиться о скорости веб-сайта
Роберт

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

Лучше закрыть. Легко и беспроблемно.
Хосе Карлос PHP,

4

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

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


1
Он говорит о PHP, который непостоянен, так что это не применимо.
Саша Чедыгов

2

Закрывается, как только сценарий завершает выполнение. Если вы не открыли постоянное соединение. В идеале вы должны освободить ресурс (здесь соединение), как только вы закончите с ним. Если нет большой вероятности, что он вам снова понадобится очень скоро при исполнении.

Пул соединений или использование постоянных соединений (если это то, что вы имели в виду) - хорошая идея, если вы находитесь за одним сервером базы данных. Однако, если серверов больше и вы выполняете балансировку нагрузки, это может повредить распределению работы. Обычно одни клиенты выполняют тяжелые запросы, а другие - более легкие. Таким образом, если одно и то же соединение используется через n, некоторые серверы будут сильно загружены, а другие будут использоваться недостаточно. Рассмотрите возможность использования меньших ttls и переменного размера пула соединений.


1

Большинство CMS закрывают соединение MySQL в конце запроса, что на самом деле бессмысленно, потому что PHP все равно сделает это.

Однако, если у вас есть сценарий, в котором соединение больше не требуется, скажем, ближе к середине сценария, а затем происходят другие тяжелые действия, тогда рекомендуется явно закрыть соединение. Это освободит некоторые ресурсы.

Сейчас много говорится о преимуществах закрытия соединения, но почти ничего не сказано о преимуществах его неиспользования. По сути, если вы не закрываете соединение в конце скрипта, вы действительно экономите некоторые ресурсы. Представьте себе веб-приложение (или любое приложение), получающее 100 просмотров страниц в секунду. Таким образом, каждую секунду вам нужно будет вызывать mysqli_close100 раз - это означает, что каждую секунду у вас будет 100 ненужных обратных обращений к серверу базы данных для закрытия открытых соединений. С точки зрения производительности это чистые накладные расходы, так как PHP все равно будет проверять наличие открытых соединений, когда сценарий завершится, и закроет эти соединения, и может быть так, потому что все происходит так быстро, что PHP не видит, что у вас есть закрыл эти соединения и попытается закрыть их снова.

Примечание: ответ выше предполагает, что вы не используете постоянные соединения (постоянные соединения не используются ни в одной из основных CMS).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.