Вопрос

У меня есть сомнения, я поискал в Интернете, и ответы кажутся разными.Лучше ли использовать mysql_pconnect вместо mysql_connect при подключении к базе данных через PHP?Я читал, что pconnect масштабируется гораздо лучше, но, с другой стороны, будучи постоянным соединением...наличие 10 000 соединений одновременно, и все постоянные, мне не кажется масштабируемым.

Заранее спасибо.

Это было полезно?

Решение

Постоянные соединения не нужны для MySQL. В других базах данных (таких как Oracle) создание соединения является дорогим и трудоемким, поэтому, если вы можете повторно использовать соединение, это большой выигрыш. Но эти базы данных предлагают пулы соединений, которые решают проблему лучше.

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

Постоянные соединения тоже имеют свои недостатки. Сервер базы данных распределяет ресурсы для каждого соединения, независимо от того, нужны эти соединения или нет. Таким образом, вы видите много потраченных впустую ресурсов без всякой цели, если соединения простаивают. Я не знаю, достигнете ли вы 10000 незанятых соединений, но даже пара сотен обходится дорого.

Соединения имеют состояние, и для 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 очень помогает, равно как и их уникальное именование (например, включение в качестве идентификатора пользователя). Транзакции немного более проблематичны; но ваш код всегда может выполнить ROLLBACK вверху, на всякий случай.

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

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

Ответ здесь чрезвычайно прост - эффективность.Постоянные подключения хороши, если накладные расходы для создания ссылки на ваш SQL Server высок.Независимо от того, действительно ли этот накладчик действительно высок, зависит от многих факторов.Например, что это за база данных, независимо от того, находится ли она на том же компьютере, на котором сидит ваш веб -сервер, как загруженная машина SQL Server находится, и так далее. Суть в том, что, если накладные расходы на соединение высоки, постоянные соединения значительно помогут вам.Они заставляют дочерний процесс просто подключаться только один раз для всей жизни, а не каждый раз, когда он обрабатывает страницу, которая требует подключения к SQL Server.Это означает, что для каждого ребенка, который открыл постоянное соединение, будет иметь собственное открытое постоянное соединение с сервером.Например, если у вас было 20 разных дочерних процессов, которые запустили сценарий, который установил постоянное соединение с вашим SQL Server, у вас будет 20 различных подключений с SQL Server, по одному от каждого ребенка.

Обратите внимание, однако, что это может иметь некоторые недостатки, если вы используете базу данных с ограничениями соединения, которые превышены постоянными дочерними соединениями.Если ваша база данных имеет предел из 16 одновременных подключений, и в ходе занятого сеанса сервера 17 детей пытаются подключиться, не удастся.Если в ваших сценариях есть ошибки, которые не позволяют отключаться соединения (например, бесконечные петли), база данных с 16 соединениями может быть быстро завалена.Проверьте документацию по базе данных для получения информации об обработке заброшенных или простоя.

mysql_connect() и mysql_pconnect() оба работают для подключения к базе данных, но с небольшой разницей.В mysql_pconnect(), p означает постоянное соединение.

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

Но в случае mysql_pconnect() функция:

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

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

mysql_pconncet() полезно, когда на вашем сайте много трафика.В это время для каждого запроса он не будет открывать соединение, а будет брать его из пула.Это повысит эффективность вашего сайта.Но для общего использования лучше всего подходит mysql_connect().

МYSQL_CONNECT()

1.mysql_connect можно использовать для закрытия соединения. Каждый раз он открывает и закрывает соединение с базой данных, в зависимости от запроса.

2.Здесь база данных открывается каждый раз, когда страница загружается в соединение MYSQL.

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); ?>

Описание:

хозяин:Указывает имя хоста или IP-адрес, например localhost.

mysql_user:Указывает имя пользователя MySQL

мойsql_пароль:Указывает пароль MySQL

МYSQL_PCONNECT()

1. Мы используем mysql_pconncet(), он изначально пытается найти открытое постоянное соединение.

2. mysql_pconncet() открывает постоянное соединение.

3. mysql_pconnect() не поддерживает закрытое соединение.

4.mysql_pconnect() не может закрыть соединение.Здесь открываем постоянное соединение с базой данных

5.Здесь базу данных не нужно подключать каждый раз.

6.Базу данных не нужно каждый раз подключать в mysql_pconncet().

подробнее:http://prittytimes.com/difference-between-mysql_connect-and-mysql_pconnect/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top