Po wielu poszukiwaniach w końcu znalazłem rozwiązanie.
Nie jestem pisarzem, więc dołożę wszelkich starań, aby uczynić to tak zwięzłym, jak to możliwe.
O ile mogłem znaleźć, istnieją 2 możliwe rozwiązania:
Przekaźnik SQL
http://sqlrelay.sourceforge.net/
Robi to dokładnie to, o co pytano i wiele innych. Nie będę zbyt szczegółowo omawiał tego, co udało mi się o tym dowiedzieć, ale wspomnę, że nie było to realne rozwiązanie, ponieważ nie jest przejrzyste. Oznacza to, że przepływ jest następujący:
PHP -> Queries -> SQL Relay Extension -> SQL Relay -> Externally hosted MySQL
Oznaczałoby to przepisanie całego naszego kodu z mysql na przekaźnik sql. W naszym przypadku nie ma takiej opcji.
To powiedziawszy, jeśli ktoś planuje nowy projekt na dużą skalę, który wymaga dowolnej z licznych funkcji SQL Relay, brzmi pięknie.
Proxy MySQL
http://forge.mysql.com/wiki/MySQL_Proxy
To jest rozwiązanie, z którego ostatecznie skorzystaliśmy.
Kluczem do zrobienia tego, co chcemy, jest pula skryptów LUA dla proxy mysql.
To rozszerzenie LUA można znaleźć pod adresem:
https://github.com/cwarden/mysql-proxy/blob/315ab806bb95b8223f5afd3d238eff2a40af03d8/lib/ro-pooling.lua
Bez wchodzenia w zbyt wiele szczegółów, oto kilka podstawowych statystyk ... Pamiętaj, że jest to testowane przy NISKIM czasie użytkowania:
[root@HOSTNAME etc]# netstat -na | grep ":3306 " | grep TIME_WAIT | wc
6433 38598 572537
Po przejściu na mysql-proxy i pozostawieniu rzeczy do rozwiązania:
[root@HOSTNAME etc]# netstat -na | grep ":3306 " | grep TIME_WAIT | wc
32 192 2848
Jak wyraźnie widać, porty TIME_WAIT do mysql spadły prawie do zera.
Połączenia są teraz w rzeczywistości trwałe BEZ użycia mysql_pconnect / mysqli_connect (... p: nazwa hosta ...).
Warto wspomnieć, że wydaje się, że istnieje kilka konfigurowalnych ustawień w górnej części skryptu lua poolera.
lokalne min_idle_connections
i
lokalne max_idle_connections
Te wydają się dość oczywiste. Tyle że: Wygląda na to, że każda kombinacja nazwy użytkownika (i hasła? Nieprzetestowane ... najprawdopodobniej nie) tworzy własny zestaw trwałych połączeń.
Pomnóż więc max_idle_connections przez liczbę unikalnych użytkowników mysql, którzy będą łączyć się z bazą danych. To powinno dać ci wyobrażenie o liczbie bezczynnych połączeń.
Powtórzę więc, aby ten mały napis trafił kilka słów kluczowych dla osób szukających za pośrednictwem Google:
Czy używając PHP można mieć trwałe połączenia mysql BEZ mysql_pconnect?
Tak, można to zrobić za pomocą przekaźnika SQL, jeśli nie masz nic przeciwko przebudowaniu większości kodu, aby przesyłać zapytania przez ich rozszerzenie LUB przejrzyście, używając mysql-proxy ze skryptem ro-pooling.lua.
Chcemy czegoś takiego od około roku.
CIESZYĆ SIĘ!
mysql_pconnecti nie uruchomisz każdego połączenia za pomocą niektórych „funkcji czyszczenia”?