Как грамотно работать с БД соединениями - Mysql/PHP?

A
На сайте с 12.10.2011
Offline
186
5524

Поискав в инете не нашел ответа, поэтому надеюсь тут помогут как всегда )

Пишу приложение на php/mysql.. скажите, если нагрузка не более 100к просмотров в сутки планируется (т.е. одно в секунду вроде), можно ли на каждой странице создавать соединение к БД и закрывать тут же.. или это считается дурным тоном дергать БД туда-сюда и может закончить не очень (не хватит ресурсов/соединений и тп)?

Может нужно какой пул соединений сделать, и брать от туда? если да сколько там держать?

Или может что то встроенное есть уже?

L
На сайте с 07.12.2010
Offline
23
#1

100к это довольно мало, поэтому можно спокойно открывать и закрывать соединение на каждой странице. Хотя тут вариантов не много, либо mysql_connect либо mysql_pconnect (собстенно эта функция и работает с пулом). Вообще открытие и закрытие соединения гораздо меньше влияет на нагрузку нежели сами запросы (их количество и "качество"). Так что лучше задуматься об оптимизации запросов.

Для работы с бд посмотрите на http://php.net/manual/ru/book.pdo.php

D
На сайте с 14.01.2007
Offline
153
#2

кол-во соединений в сутки не играет (почти) ни какой роли. главное - кол-во одновременных соединений. а тут всё зависит от размера вашего сервера.

но если у вас будет 100к в день, то будет и кэш и свой(свои) сервер отдельно для БД

а пока: открыли, сделали что надо, закрыли. только делайте доступ к БД через 1 класс/функцию, а не разбрасывайте по проекту. потом будет проще кэш прикрутить

LEOnidUKG
На сайте с 25.11.2006
Offline
1722
#3

Фокус в том, чтобы вообще не трогать БД.

А ещё мощный сервер и правильная структура БД, а так же упростить запросы.

Мы не знаем, что у вас за приложение и что там будет работать, поэтому ответ: А чёрт его знает, что вас с ним делать.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
kedbl4
На сайте с 25.08.2011
Offline
93
#4

Создайте пул соединений. То есть в пуле у вас допустим хранится 50 коннектов к базе, уже подключенных. Когда пользователю нужно сделать запрос, он берет себе соединение из пула (заранее созданное), выполняет запрос, затем назад возвращает соединение в пул. В нашем случае одновременно смогут выполнить запрос 50 пользователей, для ваших целей размер пула может быть гораздо меньше. Основная суть в том, что соединения созданы заранее и существуют постоянно, пока работает сервер.

A
На сайте с 12.10.2011
Offline
186
#5

спасибо, есть над чем подумать )

Еще почитал, что есть "устойчивое соединение" - pconnect, но там тоже неоднозначно..

Чтоб темы не плодить, не подскажите вот по какому поводу ..

допустим создаю переменную подключения к БД (db) в class1, и передаю ее в class2 через конструктор.. в class2 есть тоже переменная db и я присваиваю ей значение соотв переданной переменной через this->db..

Вопрос. Когда после выполненных методов в class2 программа возвращается в class1 и там закрываю соединение, в class2 ничего лишнего не останется? :)

Я так понимаю что две переменные не создаются (Дубликаты) а это просто указатель на переменную, соотв. соединение всего одно и проблем не будет. Я правильно понимаю )?

kedbl4
На сайте с 25.08.2011
Offline
93
#6
alexverem:
спасибо, есть над чем подумать )

Еще почитал, что есть "устойчивое соединение" - pconnect, но там тоже неоднозначно..

Чтоб темы не плодить, не подскажите вот по какому поводу ..

допустим создаю переменную подключения к БД (db) в class1, и передаю ее в class2 через конструктор.. в class2 есть тоже переменная db и я присваиваю ей значение соотв переданной переменной через this->db..

Вопрос. Когда после выполненных методов в class2 программа возвращается в class1 и там закрываю соединение, в class2 ничего лишнего не останется? :)

Я так понимаю что две переменные не создаются (Дубликаты) а это просто указатель на переменную, соотв. соединение всего одно и проблем не будет. Я правильно понимаю )?

"Присваивание по ссылке также поддерживается, для него используется синтаксис $var = &$othervar;. 'Присваивание по ссылке' означает, что обе переменные указывают на одни и те же данные и никакого копирования не происходит." http://php.net/manual/ru/language.operators.assignment.php

A
На сайте с 12.10.2011
Offline
186
#7
kedbl4:
"Присваивание по ссылке также поддерживается, для него используется синтаксис $var = &$othervar;. 'Присваивание по ссылке' означает, что обе переменные указывают на одни и те же данные и никакого копирования не происходит." http://php.net/manual/ru/language.operators.assignment.php

Правильно я понимаю что в классе2 мне нужно сделать так?

$this->db =&$db;

тогда при закрыии БД вне класса в классе тоже ничего не останется?

bay_ebook
На сайте с 28.05.2010
Offline
111
#8

в пхп 5,3 и выше - классы автоматом присваиваются, и использовать & не нужно. А для копирования нужно использовать __clone , так что при передаче $this->db = $db все норм, усложнять себе жизнь не обязательно.

Нужен прогер на php+mysql+понимание чужего кода? (/ru/forum/540660) Вам сюда PHP-шаман (http://php-shaman.pw/)
A
На сайте с 12.10.2011
Offline
186
#9

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

LEOnidUKG
На сайте с 25.11.2006
Offline
1722
#10
наверно как то уничтожается ж класс и его содержание )

После выполнение любого скрипта, подключения обрывается автоматически.

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