У меня есть это сомнение, я искал в Интернете, и ответы кажутся разнообразными. Лучше ли использовать mysql_pconnect через mysql_connect при подключении к базе данных через PHP? Я читал, что pconnect масштабируется намного лучше, но с другой стороны, будучи постоянным соединением … имея 10 000 подключений одновременно, все настойчивые, не кажутся масштабируемыми для меня.
Заранее спасибо.
Для MySQL нужны постоянные соединения. В других базах данных (например, Oracle) подключение к сети дорого и требует много времени, поэтому, если вы можете повторно использовать соединение, это большая победа. Но эти бренды базы данных предлагают объединение пулов, что лучше решает проблему.
Создание соединения с базой данных MySQL быстро сравнивается с этими другими брендами, поэтому использование постоянных подключений дает пропорционально меньше преимуществ для MySQL, чем для другой марки базы данных.
Стойкие соединения также имеют недостаток. Сервер базы данных выделяет ресурсы для каждого соединения, независимо от того, нужны ли соединения или нет. Таким образом, вы видите много потерянных ресурсов без цели, если соединения простаивают. Я не знаю, достигнете ли вы 10 000 простоя, но даже пара сотен стоит дорого.
Соединения имеют состояние, и было бы неуместно, чтобы PHP-запрос «наследовал» информацию из сеанса, ранее использовавшегося другим запросом PHP. Например, временные таблицы и пользовательские переменные обычно очищаются по мере закрытия соединения, но не при использовании постоянных подключений. Подобно настройкам на основе сеанса, таким как набор символов и сортировка. Кроме того, LAST_INSERT_ID()
будет сообщать об идентификаторе, который был сгенерирован во время сеанса, даже если это было во время предыдущего запроса PHP.
Для MySQL, по крайней мере, недостаток постоянных соединений, вероятно, перевешивает их преимущества. И есть другие, лучшие методы для достижения высокой масштабируемости.
Обновление марта 2014 года:
Скорость соединения MySQL всегда была низкой по сравнению с другими брендами РСУБД, но она становится еще лучше.
См. http://mysqlserverteam.com/improving-connectdisconnect-performance/
В MySQL 5.6 мы приступили к работе по оптимизации обработки кода подключений и разъединений. И эта работа ускорилась в MySQL 5.7. В этом сообщении в блоге я сначала покажу результаты, которые мы достигли, а затем опишем, что мы сделали для их получения.
Читайте блог, чтобы узнать больше и сравнить скорость.
В основном вам необходимо сбалансировать затраты на создание соединений и поддержание соединений. Несмотря на то, что MySQL очень быстро настраивает новое соединение, он по-прежнему стоит – во время установки потока и в настройке TCP / IP с вашего веб-сервера. Это заметно на достаточно высоком участке трафика. К сожалению, у PHP нет никаких элементов управления постоянством соединений. Таким образом, ответ заключается в том, чтобы сократить длительность простоя в MySQL долгий путь (например, до 20 секунд) и увеличить размер кэша потоков. Вместе это в целом работает замечательно хорошо.
С другой стороны, ваше приложение должно уважать состояние соединения. Лучше всего, если он не делает никаких предположений о том, в каком состоянии находится сеанс. Если вы используете временные таблицы, то использование CREATE IF NOT EXISTS и TRUNCATE TABLE помогает много, так же как именовать их однозначно (например, включать в качестве userid). Сделки более проблематичны; но ваш код всегда может делать ROLLBACK вверху, на всякий случай.
Очень маловероятно, что вы достигнете 10000 соединений. Во всяком случае, идите в официальный источник . (Акцент мой).
Если постоянные соединения не имеют каких-либо дополнительных функций, для чего они хороши?
Ответ здесь предельно прост – эффективность. Стойкие соединения хороши, если накладные расходы для создания ссылки на ваш SQL-сервер высоки. Независимо от того, действительно ли это накладные расходы действительно высоки, зависит от многих факторов. Например, какая база данных, независимо от того, сидит ли она на том же компьютере, на котором сидит ваш веб-сервер, как загружается машина, на которой сидит сервер SQL, и так далее. Суть в том, что, если накладные расходы на соединение высоки, постоянные подключения помогают вам значительно . Они заставляют дочерний процесс просто подключаться только один раз в течение всего срока его службы, а не каждый раз, когда он обрабатывает страницу, требующую подключения к SQL-серверу. Это означает, что для каждого дочернего объекта, открывшего постоянное соединение, будет иметь свое открытое постоянное соединение с сервером. Например, если у вас было 20 разных дочерних процессов, которые запускали скрипт, который выполнял постоянное соединение с вашим SQL-сервером, у вас было бы 20 различных подключений к SQL-серверу, по одному от каждого дочернего.
Обратите внимание, однако, что это может иметь некоторые недостатки, если вы используете базу данных с ограничениями на подключение, которые превышены постоянными дочерними соединениями. Если ваша база данных имеет ограничение на 16 одновременных подключений, а в ходе сеанса занятого сервера 17 дочерних потоков пытаются подключиться, никто не сможет. Если в ваших сценариях есть ошибки, которые не позволяют отключать соединения (например, бесконечные циклы), база данных с 16 соединениями может быть быстро затоплена. Проверьте информацию о работе с заброшенными или незанятыми соединениями в документации к вашей базе данных.
mysql_connect()
и mysql_pconnect()
оба работают для подключения к базе данных, но имеют небольшую разницу. В mysql_pconnect()
p
означает соединение p
постоянным доступом.
Когда мы используем функцию mysql_connect()
, каждый раз, когда она открывает и закрывает соединение с базой данных, в зависимости от запроса.
Но в случае функции mysql_pconnect()
:
Во-первых, при подключении функция попытается найти (постоянное) соединение, которое уже открыто с тем же хостом, именем пользователя и паролем. Если он найден, идентификатор для него будет возвращен вместо открытия нового соединения.
Во-вторых, соединение с сервером SQL не будет закрыто при завершении выполнения скрипта. Вместо этого соединение будет оставаться открытым для будущего использования ( mysql_close()
не будет закрывать соединение, установленное mysql_pconnect()
).
mysql_pconncet()
полезен, когда у вас много трафика на вашем сайте. В то время для каждого запроса он не будет открывать соединение, но будет принимать его из пула. Это повысит эффективность вашего сайта. Но для общего использования лучше всего использовать mysql_connect ().
Mysql_connect ()
1.mysql_connect может использоваться для закрытия соединения. Каждое время он открывает и закрывает соединение с базой данных, в зависимости от запроса.
База данных 2.Here открывается каждый раз, когда страница загружается в MYSQL connect
3. Когда страница загружается, база данных загружается каждый раз
4. Он используется для закрытия соединения
Пример:
<?php $conn = mysql_connect('host', 'mysql_user', 'mysql_password'); if(!$conn){ die('Could not connect: ' . mysql_error()); } echo 'Connected successfully'; mysql_close($conn); ?>
Описание:
host: Указывает имя хоста или IP-адрес, например localhost.
mysql_user: указывает имя пользователя MySQL
mysql_password: указывает пароль MySQL
Mysql_pconnect ()
1. Мы используем mysql_pconncet (), изначально пытаемся найти открытое постоянное соединение.
2. mysql_pconncet () открывает постоянное соединение
3.The mysql_pconnect () не поддерживает тесное соединение
4.mysql_pconnect () не может закрыть соединение. Здесь откройте постоянное соединение с базой данных
База данных 5.Here не должна быть подключена каждый раз.
6. База данных не должна подключаться каждый раз в mysql_pconncet ().
подробнее: http://prittytimes.com/difference-between-mysql_connect-and-mysql_pconnect/