Подключение к mysql и more than max _ user _ connections

12
[Удален]
3420

У меня возник вопрос по функциям подключения БД mysql

есть 2 известным мне способа mysql_connect и mysql_pconnect

Как мне известно mysql_pconnect не закрывает соедиение с БД и висит в процессах. На движке использую mysql_pconnect.

На серверах админы делают ограничение на количество одновременных подключений к БД. (20 подключений).

Вопрос какое из подключений лучше использовать? Если лучше использовать pconnect , то в чем прелесть его использования ?

И что делать с незакрытыми подключениями? (Например пользователь начал загружать сайт и нажал на кнопку отменить. Скрипт выполнялся, но закрыть подключение к БД не успел и подключение висит как открытое).

Последние 2 дня начала лезть следующая ошибка.

Warning: mysql_connect() [function.mysql-connect]: User (имя базы) already has more than ' max _ user _ connections ' active connections in (ну и сам путь к фалу)

И так сам вопросы :

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

2. Спасет ли меня постоянная ф-ция mysql_close() по окончания каждого запроса.

3. Пробывал использовать pconnect - результат тот же. Что делать.

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

Всем спасибо за внимание буду очень благодарен за очень дельные советы

G
На сайте с 24.06.2008
Offline
54
#1
dandandan:
И что делать с незакрытыми подключениями? (Например пользователь начал загружать сайт и нажал на кнопку отменить. Скрипт выполнялся, но закрыть подключение к БД не успел и подключение висит как открытое).

http://php.net/register_shutdown_function

Dreammaker
На сайте с 20.04.2006
Offline
569
#2

Используйте

mysql_connect

Использовать mysql_pconnect на обычных CMS, а тем более на обычном хостинге я лично смысла не вижу.

update: у вас подпись правила нарушает, измените пока модераторы штраф не влепили.

Dreammaker добавил 06.08.2008 в 21:46

Ну и вполне логичный вопрос - посещаемость не очень большая?

[Удален]
#3

Посещаемость около 100 человек в день.

Поэтому и возник такой вопрос. Ограничение на коннект 30 линков.

кстати можно ссылку на правила ?.

Dreammaker
На сайте с 20.04.2006
Offline
569
#4
dandandan:
Посещаемость около 100 человек в день.

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

dandandan:
кстати можно ссылку на правила ?.

BR
На сайте с 28.06.2008
Offline
75
#5

1. Используйте pconnect (правда смысл в его использовании есть только если PHP подключен как модуль, а не как CGI). pconnect не закрывает открытое соединение (mysql_close ничего не делает в этом случае), но и не открывает новое соединение, а использует уже созданное, т. е. в идеале у Вас будет одно соединение вместо 20

2. Создание нового соединения занимает довольно значительное время (в 10-100 раз больше чем время выполнения простого SQL-запроса), поэтому pconnect позволяет повысить производительность.

3. Уточните как подключен к серверу PHP (CGI/модуль) и как собран Apache (prefork/multithreaded?). Скорее всего pconnect просто не работает у Вашего хостера.

размещение сайтов (http://www.brim.ru)
Dreammaker
На сайте с 20.04.2006
Offline
569
#6

mysql_pconnect нужно тюнинговать иначе max_user_connections забивается уже pconnect`ами только спящими (у которых превышено время ожидания). А это подразумевает и необходимость чистки этих спящих процессов.

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

Если мне кто-то докажет что я не прав, то буду рад получению новых знаний и смены парадигмы :)

[Удален]
#7

К сожалению сейчас ответить не смогу, админа в асе нету. Вот конфиг сервера http://hosting.totel.ru/phpinfo.php . Сам , к сожалению, не знаю чем отличается в PHP (CGI/модуль) и как собран Apache (prefork/multithreaded?)

BR
На сайте с 28.06.2008
Offline
75
#8
dandandan:
К сожалению сейчас ответить не смогу, админа в асе нету. Вот конфиг сервера http://hosting.totel.ru/phpinfo.php . Сам , к сожалению, не знаю чем отличается в PHP (CGI/модуль) и как собран Apache (prefork/multithreaded?)

- судя по phpinfo - PHP подключен как модуль к Apache (как собран Apache отсюда не узнаешь), так что есть шансы что pconnect реально может работать

Brim.ru добавил 07.08.2008 в 01:32

Dreammaker:
mysql_pconnect нужно тюнинговать иначе max_user_connections забивается уже pconnect`ами только спящими (у которых превышено время ожидания). А это подразумевает и необходимость чистки этих спящих процессов

- объясните как pconnect-у удается открыть несколько соединений при условии что данные для доступа к базе одинаковые (хост, логин, пароль)?

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

mysql_pconnect() работает аналогично mysql_connect() с двумя отличиями.

Во-первых, при соединении, функция пытается найти уже открытый (постоянный) указатель на тот же сервер с тем же пользователем и паролем. Если он найден, возвращён функцией будет именно он, вместо открытия нового соединения.

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

- единственная возможная причина накопления соединений при использовании pconnect - это несколько запущенных экземпляров (процессов) web-сервера с подключенным php-модулем, что актуально для Apache собранного как prefork (но в этом случае в возникших проблемах виноват хостер, так как он должен настроить лимит соединений с БД равным настройке MaxClients в Apache)

- да, и конечно хостеру можно посоветовать уменьшить wait_timeout в MySQL, чтобы незакрытые коннекты не зависали слишком на долго :)

Dreammaker
На сайте с 20.04.2006
Offline
569
#9
Brim.ru:
- объясните как pconnect-у удается открыть несколько соединений при условии что данные для доступа к базе одинаковые (хост, логин, пароль)?

вот этот момент мне не до конца самому понятен. То есть, 3-4-... скрипта при одновременном запуске будут одновременно использовать одно и тоже соединение?

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

Если первый вариант, то что мы получим, например, по mysql_insert_id ? Когда операции вставки будут выполняться одновременно из разных скриптов. Идёт же привязка к определённому идентификатору...

[Удален]
#10

Узнал у админа апач собран с multithreaded

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий