Çok araştırma yaptıktan sonra sonunda bir çözüm buldum.
Ben bir yazar değilim, bu yüzden bunu olabildiğince özlü hale getirmek için elimden geleni yapacağım.
Bulabildiğim kadarıyla, 2 olası çözüm var:
SQL Geçişi
http://sqlrelay.sourceforge.net/
Bu tam olarak sorunun sorduğunu ve daha fazlasını yapar. Bu konuda ne bulabildim konusunda çok fazla ayrıntıya girmeyeceğim, ancak şeffaf olmadığı için uygulanabilir bir çözüm olmadığını söyleyeceğim. Akışın şu şekilde olduğu anlamına gelir:
PHP -> Queries -> SQL Relay Extension -> SQL Relay -> Externally hosted MySQL
Bu, mysql'den sql rölesine tüm kodumuzu yeniden yazmayı gerektiriyordu. Bizim durumumuzda bir seçenek değil.
Tüm bunlar söyleniyor, eğer birisi SQL Relay'ın sahip olduğu sayısız özellikten herhangi birini gerektiren taze büyük ölçekli bir proje planlıyorsa , kulağa hoş geliyor.
MySQL Proxy
http://forge.mysql.com/wiki/MySQL_Proxy
Sonunda kullandığımız çözüm bu.
Bunu yapmak istediğimiz şeyi yapmanın anahtarı, mysql proxy için havuzlama LUA komut dosyasıdır.
Bu LUA uzantısı şu adreste bulunabilir:
https://github.com/cwarden/mysql-proxy/blob/315ab806bb95b8223f5afd3d238eff2a40af03d8/lib/ro-pooling.lua
Çok fazla ayrıntıya girmeden, bazı temel istatistikler şunlardır ... Unutmayın, bu DÜŞÜK kullanım zamanında test edilir:
[root@HOSTNAME etc]# netstat -na | grep ":3306 " | grep TIME_WAIT | wc
6433 38598 572537
Mysql-proxy'ye geçtikten ve bir şeylerin yerleşmesine izin verdikten sonra:
[root@HOSTNAME etc]# netstat -na | grep ":3306 " | grep TIME_WAIT | wc
32 192 2848
Gördüğünüz gibi, mysql'e giden TIME_WAIT bağlantı noktaları neredeyse hiçine düşmedi.
Artık bağlantılar mysql_pconnect / mysqli_connect (... p: hostname ...) kullanarak OLMADAN kalıcıdır .
Bahsetmeye değer, havuzcu lua betiğinin üst kısmında birkaç yapılandırılabilir ayar olduğu görülmektedir.
yerel min_idle_connections
ve
yerel max_idle_connections
Bunlar oldukça açıklayıcı görünüyor. Bunun dışında: Her kullanıcı adı (ve parola? Denenmemiş ... büyük olasılıkla tho değil) kombinasyonunun kendi kalıcı bağlantıları oluşturduğu anlaşılıyor.
Yani max_idle_connections veritabanına bağlanacak benzersiz mysql kullanıcı sayısı ile çarpın. Ve bu size kaç tane boşta bağlantı kuracağınız konusunda bir fikir verecektir.
Bu nedenle, bu küçük bulanıklığın google üzerinden arama yapanlar için bazı anahtar kelimelere çarpması için tekrar edeyim:
PHP kullanırken mysql_pconnect OLMADAN kalıcı mysql bağlantıları olması mümkün mü?
Evet, sorgularınızın çoğunu uzantıları aracılığıyla iletmek için kodunuzun çoğunu yeniden yapılandırmak veya ro-pooling.lua komut dosyasıyla mysql-proxy kullanarak şeffaf bir şekilde sakıncası yoksa bu SQL Relay ile yapılabilir.
Yaklaşık bir yıldır böyle bir şey istiyoruz.
ZEVK ALMAK!
mysql_pconnect
her bağlantıyı bazı "temizleme işlevleriyle" kullanmaya başlamıyorsunuz?