Deskripsi masalah
Beberapa pengguna PHP melaporkan bahwa performa ApsaraDB for Memcache tidak memenuhi indeks yang diharapkan selama pengujian. Setelah ditindaklanjuti, ditemukan bahwa sebagian besar pengguna menggunakan layanan web Apache untuk terhubung ke ApsaraDB for Memcache melalui PHP dengan koneksi pendek. Overhead setiap koneksi pendek mencakup penyambungan ulang socket dan prosedur re-autentikasi yang rumit, jauh lebih besar dibandingkan permintaan umum. Hal ini sangat memengaruhi efisiensi situs web.
Solusi
Kami merekomendasikan pengguna untuk mengubah koneksi pendek menjadi koneksi persisten. Namun, ApsaraDB for Memcache memerlukan penggunaan ekstensi PHP Memcached yang tidak memiliki antarmuka pconnect seperti pada ekstensi memcache. Berikut adalah panduan untuk membuat koneksi persisten dalam PHP sebagai referensi Anda.
Situs Resmi PHP menjelaskan bahwa konstruktor memcached mencakup hal berikut:
Catatan:
Memcached::__construct ([ string $persistent_id ] ): Buat instance Memcached yang mewakili koneksi ke ujung layanan Memcached.
Parameter
Persistent_id: Secara default, instance Memcached dihapus setelah permintaan selesai. Namun, Anda dapat menentukan ID unik untuk setiap instance melalui persistent_id saat pembuatan instance untuk berbagi instance antar permintaan. Semua instance yang dibuat dengan menggunakan persistent_id yang sama berbagi koneksi yang sama.Artinya, Anda harus melewati persistent_id yang identik ke konstruktor untuk mencapai koneksi bersama. Implementasi kode adalah sebagai berikut:
<?php
$memc = new Memcached(‘ocs’);//ocs merujuk pada persistent_id
if (count($memc->getServerList()) == 0) /*Sebelum membangun koneksi, pertama-tama periksa*/
{
echo "Koneksi baru"."<br>";
/*Semua opsi harus disertakan dalam evaluasi, karena beberapa opsi dapat menyebabkan penyambungan ulang, atau menyebabkan koneksi persisten menjadi koneksi pendek.*/
$memc->setOption(Memcached::OPT_COMPRESSION, false);
$memc->setOption(Memcached::OPT_BINARY_PROTOCOL, true);
$memc->setOption(Memcached::OPT_TCP_NODELAY, true); //Penting: php memcached memiliki bug ketika nilai get tidak ada, ada latensi tetap 40 ms. Mengaktifkan parameter ini dapat menghindari bug ini.
/* Kode addServer harus disertakan dalam evaluasi, jika tidak sama saja dengan mengulangi pembuatan pool koneksi ‘ocs’, yang dapat menyebabkan pengecualian dalam program PHP klien.*/
$memc->addServer("your_ip", 11212);
$memc->setSaslAuthData("user", "password");
}
else
{
echo "Jumlah koneksi sekarang adalah:".count($memc->getServerList())."<br>";
}
$memc->set("key", "value");
echo "Dapatkan dari OCS: ".$memc->get("key");
//$memc->quit();/*Jangan tambahkan ‘quit’ di akhir kode, jika tidak koneksi persisten akan berubah menjadi koneksi pendek. */
?>Terdapat tiga poin penting dalam kode tersebut. Kata kunci ocs dalam konstruktor setara dengan pool koneksi. Dengan memanggil new Memcached (ocs), Anda dapat memperoleh koneksi dari pool untuk digunakan.
Hasil eksekusi
Simpan kode sebelumnya di jalur kerja Apache /var/www/html/ dan beri nama test.php. Masukkan di browser: Http://your_ip:80/test.php. Hasil keluaran delapan percobaan pertama di browser adalah:
Koneksi baru
Dapatkan dari OCS: valueArtinya, semua delapan percobaan tersebut membuat koneksi baru, sedangkan percobaan selanjutnya menggunakan kembali delapan koneksi tersebut. Hasil analisis paket juga menunjukkan bahwa setelah delapan percobaan pertama, koneksi bersifat persisten tanpa penyambungan ulang socket atau autentikasi.
Setelah memeriksa file httpd.conf, diketahui bahwa Apache memulai delapan subproses, yang menjadi alasan adanya delapan koneksi.
#StartServers: jumlah proses server untuk dimulai
StartServers 8Akibatnya, delapan koneksi diinisialisasi dalam pool koneksi dengan persistent_id ocs, dan permintaan selanjutnya dapat menggunakan delapan koneksi tersebut.
Navigasi halaman
Salin file PHP dan buat persistent_id konstruktor. Kami masih menggunakan ocs. Hasilnya menunjukkan bahwa koneksi beralih (karena subproses Apache yang dipanggil berbeda), tetapi tanpa autentikasi atau penyambungan ulang socket. Artinya, pengaturan koneksi persisten PHP Memcached efektif. Biasanya, kami menggunakan mode PHP-FPM. Proses FPM menjaga koneksi persisten dengan server Memcached, sehingga siklus hidup koneksi ini sama dengan proses Apache.