Как закрыть незакрытые соединения mysql?

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

Я добавил функцию mysql_close в конце страниц. Это закрывает соединения, но все же некоторые связи остаются незакрытыми. Я могу кое-где уехать ..

Что мне нужно, так это закрыть незакрытые соединения mysql на сервере с помощью файла cron или чего-то еще ..

Что мне нужно сделать?

Можно ли закрыть сразу все подключения? если да, то как?


person Jagadeesan    schedule 12.06.2011    source источник
comment
вы можете попробовать использовать mysql_pconnect, который имеет побочные эффекты, хотя, как описано в stackoverflow.com/questions/1340859/   -  person konsolenfreddy    schedule 12.06.2011
comment
как закрыть соединение, открытое в mysql_pconnect, попробуем ..   -  person Jagadeesan    schedule 12.06.2011


Ответы (3)


Вы используете постоянные соединения? ЕСЛИ нет, то вам действительно не стоит слишком беспокоиться о закрытии ваших соединений. Из руководства

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

Может быть, вместо too_much незакрытых соединений (что, по сути, одно и то же) у вас слишком много открытых соединений? Например, на вашем сайте одновременно слишком много пользователей?

Если у вас есть постоянные соединения, не забывайте об этом:

mysql_close () не закрывает постоянные ссылки, созданные mysql_pconnect ().

Как сказано в комментарии, очень маловероятно, что ресурс mysql_connect() не будет освобожден в конце скрипта. С другой страницы руководства

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

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

Примечание. Постоянные ссылки на базы данных являются исключением из этого правила. Сборщик мусора не уничтожает их. См. Раздел постоянных подключений для получения дополнительной информации.

Однако здесь может быть заметка из комментариев на странице mysql_close

По крайней мере, с PHP5.3.2 и Windows, соединяющимися через tcp, вы всегда должны использовать эту функцию mysql_close () для закрытия и освобождения сокета tcp, используемого PHP. Сборка мусора после выполнения скрипта сама по себе не закрывает TCP-сокет. В противном случае сокет оставался бы в состоянии ожидания примерно 30 секунд, и любые дополнительные загрузки страниц / попытки подключения только добавили бы к общему количеству открытых TCP-подключений. Это время ожидания не может быть изменено с помощью настроек PHP.

person Nanne    schedule 12.06.2011
comment
соединения, кажется, открываются только с помощью mysql_connect () .. как закрыть открытое даже в mysql_pconnect, давайте попробуем это .. - person Jagadeesan; 12.06.2011
comment
Но чтобы быть уверенным: вам не нужно закрывать каждое соединение в конце ваших файлов: оно будет закрыто автоматически там. Вам нужно только закрыть его, если вы хотите сделать это на полпути, чтобы освободить ресурсы. Не тратьте время и силы, добавляя mysql_close во все ваши скрипты: D. Если вы не используете pconnect, вам, конечно, не нужно беспокоиться о закрытии этих - person Nanne; 12.06.2011
comment
Нет, он не закрывается сам по себе :( - person Jagadeesan; 12.06.2011
comment
Маловероятно, что они не закрываются. ЧРЕЗВЫЧАЙНО даже. Если страница перестает работать, соединение закрывается. Ваша проблема может заключаться в том, что страница не перестает работать, одновременно работает слишком много страниц, вы используете pconnect и т. Д. И т. Д., Но вероятность того, что у вас есть нормальный скрипт php с mysql_connect(), который не закрывает свое соединение в конце кажется мне нулевым. Вы бы нашли неизвестную ошибку в php. - person Nanne; 12.06.2011

mysql_connect вернет идентификатор фактического соединения, который вы можете использовать в своем вызове mysql_close.

$conn1 = mysql_connect(.....);
mysql_close($conn1);

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

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

person jishi    schedule 12.06.2011

Если у вас есть незакрытые соединения, есть вероятность, что вы пропустили некоторые страницы, возможно, через include и т. Д. Или функции, вызывающие «exit», чтобы вы не достигли своего закрытого кода.

Я не верю, что вы можете загружать другие соединения из mysql с помощью cron.

person BugFinder    schedule 12.06.2011