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_pconnect
i nie uruchomisz każdego połączenia za pomocą niektórych „funkcji czyszczenia”?Stała obsługa połączeń została wprowadzona w PHP 5.3 dla
mysqli
rozszerzenia. Wsparcie było już obecne w PDO MYSQL i ext / mysql. Idea trwałych połączeń polega na tym, że połączenie między procesem klienta a bazą danych może być ponownie wykorzystane przez proces klienta, a nie wielokrotnie tworzone i niszczone. Zmniejsza to narzut związany z tworzeniem nowych połączeń za każdym razem, gdy jest to wymagane, ponieważ nieużywane połączenia są buforowane i gotowe do ponownego użycia.W przeciwieństwie do rozszerzenia mysql,
mysqli
nie zapewnia osobnej funkcji do otwierania trwałych połączeń. Aby otworzyć trwałe połączenie, musisz połączyć p: z nazwą hosta podczas łączenia.Trwałe połączenie rozszerzenia mysqli zapewnia jednak wbudowany kod obsługi czyszczenia. Oczyszczanie przeprowadzone przez mysqli obejmuje:
Zapewnia to, że trwałe połączenia są w stanie czystym po powrocie z puli połączeń, zanim proces klienta ich użyje.
Rozszerzenie mysqli wykonuje to czyszczenie, automatycznie wywołując funkcję C-API
mysql_change_user()
.Funkcja automatycznego czyszczenia ma jednak zalety i wady. Zaletą jest to, że programista nie musi się już martwić dodaniem kodu czyszczącego, ponieważ jest on wywoływany automatycznie. Wadą jest jednak to, że kod może być nieco wolniejszy, ponieważ kod wykonujący czyszczenie musi być uruchamiany za każdym razem, gdy połączenie jest zwracane z puli połączeń.
Możliwe jest wyłączenie kodu automatycznego czyszczenia, kompilując PHP ze
MYSQLI_NO_CHANGE_USER_ON_PCONNECT
zdefiniowanym.Uwaga:
Rozszerzenie mysqli obsługuje trwałe połączenia przy użyciu MySQL Native Driver lub MySQL Client Library.
Możesz również skorzystać z tych linków: http://www.mysqlperformanceblog.com/2006/11/12/are-php-persistent-connections-evil/
źródło