После долгих поисков я наконец нашел решение.
Я не большой писатель, поэтому я сделаю все возможное, чтобы сделать это как можно более кратким.
Итак, насколько я мог найти, есть 2 возможных решения:
SQL Relay
http://sqlrelay.sourceforge.net/
Это делает именно то, что задал вопрос, и еще кучу. Я не буду вдаваться в подробности того, что мне удалось узнать по этому поводу, но упомяну, что это не было жизнеспособным решением, поскольку оно не прозрачно. Это означает, что поток выглядит следующим образом:
PHP -> Queries -> SQL Relay Extension -> SQL Relay -> Externally hosted MySQL
Так что это потребовало бы переписать весь наш код с mysql на sql relay. Не вариант в нашем случае.
При этом, если кто-то планирует новый крупномасштабный проект, который требует какой-либо из многочисленных функций, которые имеет SQL Relay, это звучит прекрасно.
Mysql Proxy
http://forge.mysql.com/wiki/MySQL_Proxy
Это решение, которое мы в конечном итоге использовали.
Ключом к тому, чтобы сделать то, что мы хотим, является пул LUA-скрипт для прокси-сервера mysql.
Это расширение LUA можно найти по адресу:
https://github.com/cwarden/mysql-proxy/blob/315ab806bb95b8223f5afd3d238eff2a40af03d8/lib/ro-pooling.lua
Не вдаваясь в подробности, вот некоторые основные статистические данные ... Имейте в виду, это проверяется при НИЗКОМ времени использования:
[root@HOSTNAME etc]# netstat -na | grep ":3306 " | grep TIME_WAIT | wc
6433 38598 572537
После переключения на mysql-proxy и разрешения проблем:
[root@HOSTNAME etc]# netstat -na | grep ":3306 " | grep TIME_WAIT | wc
32 192 2848
Как вы можете ясно видеть, порты TIME_WAIT для mysql упали почти до нуля.
Соединения теперь фактически постоянны БЕЗ использования mysql_pconnect / mysqli_connect (... p: hostname ...).
Стоит упомянуть, что в верхней части скрипта pooler lua есть несколько настраиваемых параметров.
локальные min_idle_connections
и
локальные max_idle_connections
Они кажутся довольно понятными. Кроме этого: может показаться, что каждая комбинация имени пользователя (и пароля? Непроверенный ... скорее всего, не tho.) Создает свой собственный набор постоянных соединений.
Так что умножьте max_idle_connections на количество уникальных пользователей mysql, которые будут подключаться к базе данных. И это должно дать вам представление о том, сколько свободных соединений у вас будет.
Итак, позвольте мне повторить, чтобы этот небольшой всплеск попал в ключевые слова для тех, кто ищет через Google:
При использовании PHP возможно ли иметь постоянные соединения mysql БЕЗ mysql_pconnect?
Да, это можно сделать с помощью SQL Relay, если вы не возражаете перестроить большую часть своего кода для передачи запросов через их расширение ИЛИ прозрачно, используя mysql-proxy со скриптом ro-pooling.lua.
Мы хотели чего-то подобного уже около года.
НАСЛАЖДАТЬСЯ!
mysql_pconnect
и не запускать каждое соединение с некоторыми «функциями очистки»?Поддержка постоянных соединений была введена в PHP 5.3 для
mysqli
расширения. Поддержка уже присутствовала в PDO MYSQL и ext / mysql. Идея постоянных соединений заключается в том, что клиентский процесс может повторно использовать соединение между клиентским процессом и базой данных, а не создавать и уничтожать несколько раз. Это уменьшает накладные расходы на создание новых соединений каждый раз, когда они требуются, поскольку неиспользуемые соединения кэшируются и готовы к повторному использованию.В отличие от расширения mysql,
mysqli
не предоставляет отдельной функции для открытия постоянных соединений. Чтобы открыть постоянное соединение, вы должны добавить p: к имени хоста при подключении.Постоянное соединение расширения mysqli обеспечивает встроенный код обработки очистки. Очистка, выполняемая mysqli, включает в себя:
Это гарантирует, что постоянные соединения находятся в чистом состоянии по возвращении из пула соединений до того, как клиентский процесс использует их.
Расширение mysqli выполняет эту очистку, автоматически вызывая функцию C-API
mysql_change_user()
.Функция автоматической очистки имеет свои преимущества и недостатки. Преимущество заключается в том, что программисту больше не нужно беспокоиться о добавлении кода очистки, поскольку он вызывается автоматически. Однако недостатком является то, что код потенциально может быть немного медленнее, поскольку код для выполнения очистки должен запускаться каждый раз, когда соединение возвращается из пула соединений.
Можно отключить код автоматической очистки, скомпилировав PHP с
MYSQLI_NO_CHANGE_USER_ON_PCONNECT
заданным значением.Замечания:
Расширение mysqli поддерживает постоянные соединения при использовании MySQL Native Driver или MySQL Client Library.
Также вы можете ссылаться на эти ссылки: http://www.mysqlperformanceblog.com/2006/11/12/are-php-persistent-connections-evil/
источник