После долгих поисков я наконец нашел решение.
Я не большой писатель, поэтому я сделаю все возможное, чтобы сделать это как можно более кратким.
Итак, насколько я мог найти, есть 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
и не запускать каждое соединение с некоторыми «функциями очистки»?