Setelah banyak mencari, akhirnya saya menemukan solusinya.
Saya tidak terlalu penulis, jadi saya akan melakukan yang terbaik untuk membuat ini sesingkat mungkin.
Sejauh yang saya bisa temukan, ada 2 solusi yang mungkin:
Relay SQL
http://sqlrelay.sourceforge.net/
Ini melakukan persis apa yang ditanyakan, dan banyak lagi. Saya tidak akan membahas terlalu banyak tentang apa yang saya dapat temukan tentang ini tetapi akan menyebutkan bahwa itu bukan solusi yang layak karena tidak transparan. Artinya alirannya adalah sebagai berikut:
PHP -> Queries -> SQL Relay Extension -> SQL Relay -> Externally hosted MySQL
Jadi ini akan melibatkan penulisan ulang semua kode kami dari mysql ke sql relay. Bukan pilihan dalam kasus kami.
Semua itu dikatakan, jika seseorang merencanakan segar proyek skala besar yang membutuhkan salah satu dari banyak fitur yang SQL Relay memiliki, kedengarannya indah.
Proksi Mysql
http://forge.mysql.com/wiki/MySQL_Proxy
Ini adalah solusi yang akhirnya kami gunakan.
Kunci untuk melakukan ini melakukan apa yang kita inginkan adalah skrip penyatuan LUA untuk proxy mysql.
Perpanjangan LUA ini dapat ditemukan di:
https://github.com/cwarden/mysql-proxy/blob/315ab806bb95b8223f5afd3d238eff2a40af03d8/lib/ro-pooling.lua
Tanpa terlalu rinci, berikut adalah beberapa statistik dasar ... Ingat, ini diuji pada waktu penggunaan RENDAH:
[root@HOSTNAME etc]# netstat -na | grep ":3306 " | grep TIME_WAIT | wc
6433 38598 572537
Setelah beralih ke mysql-proxy, dan membiarkan semuanya beres:
[root@HOSTNAME etc]# netstat -na | grep ":3306 " | grep TIME_WAIT | wc
32 192 2848
Seperti yang Anda lihat dengan jelas, port TIME_WAIT ke mysql telah turun hampir tidak ada.
Koneksi sekarang sebenarnya persisten TANPA menggunakan mysql_pconnect / mysqli_connect (... p: nama host ...).
Layak disebutkan ada beberapa pengaturan yang dapat dikonfigurasi di dekat bagian atas script pooler lua.
min_idle_connections lokal
dan
max_idle_connections lokal
Ini tampaknya cukup jelas. Kecuali itu: Akan muncul bahwa setiap kombinasi nama pengguna (dan kata sandi? Belum teruji ... kemungkinan besar bukan.) Menciptakan rangkaian koneksi persistennya sendiri.
Jadi gandakan max_idle_connections dengan jumlah pengguna mysql unik yang akan terhubung ke database. Dan itu akan memberi Anda gambaran tentang berapa banyak koneksi idle Anda akhirnya akan memiliki.
Jadi, izinkan saya mengulangi kembali sehingga sedikit uraian singkat ini mengenai beberapa kata kunci untuk mereka yang mencari melalui google:
Ketika menggunakan PHP, apakah mungkin untuk memiliki koneksi mysql persisten TANPA mysql_pconnect?
Ya, ini bisa dilakukan melalui SQL Relay jika Anda tidak keberatan membangun kembali sebagian besar kode Anda untuk mengirimkan pertanyaan melalui ekstensi ATAU secara transparan menggunakan mysql-proxy dengan skrip ro-pooling.lua.
Kami telah menginginkan sesuatu seperti ini selama sekitar satu tahun sekarang.
NIKMATI!
mysql_pconnect
dan memulai setiap koneksi dengan beberapa "fungsi pembersihan"?Dukungan koneksi gigih diperkenalkan di PHP 5.3 untuk
mysqli
ekstensi. Dukungan sudah ada di PDO MYSQL dan ext / mysql. Gagasan di balik koneksi persisten adalah bahwa koneksi antara proses klien dan database dapat digunakan kembali oleh proses klien, daripada dibuat dan dihancurkan beberapa kali. Ini mengurangi overhead untuk membuat koneksi baru setiap kali diperlukan, karena koneksi yang tidak digunakan di-cache dan siap untuk digunakan kembali.Berbeda dengan ekstensi mysql,
mysqli
tidak menyediakan fungsi terpisah untuk membuka koneksi persisten. Untuk membuka koneksi persisten, Anda harus menambahkan p: ke nama host saat menghubungkan.Sambungan terus-menerus dari ekstensi mysqli menyediakan kode penanganan pembersihan bawaan. Pembersihan yang dilakukan oleh mysqli meliputi:
Ini memastikan bahwa koneksi yang persisten berada dalam kondisi bersih saat kembali dari kumpulan koneksi, sebelum proses klien menggunakannya.
Ekstensi mysqli melakukan pembersihan ini dengan secara otomatis memanggil fungsi C-API
mysql_change_user()
.Fitur pembersihan otomatis memiliki kelebihan dan kekurangan. Keuntungannya adalah bahwa programmer tidak perlu lagi khawatir tentang menambahkan kode pembersihan, seperti yang disebut secara otomatis. Namun, kerugiannya adalah bahwa kode berpotensi menjadi sedikit lebih lambat, karena kode untuk melakukan pembersihan perlu dijalankan setiap kali koneksi dikembalikan dari kumpulan koneksi.
Dimungkinkan untuk mematikan kode pembersihan otomatis, dengan mengkompilasi PHP dengan yang
MYSQLI_NO_CHANGE_USER_ON_PCONNECT
ditentukan.catatan:
Ekstensi mysqli mendukung koneksi persisten saat menggunakan Driver Native MySQL atau Library Klien MySQL.
Anda juga dapat merujuk tautan ini: http://www.mysqlperformanceblog.com/2006/11/12/are-php-persistent-connections-evil/
sumber