全部产品
Search
文档中心

ApsaraDB for Memcache:Gunakan koneksi persisten PHP untuk meningkatkan performa

更新时间:Jun 30, 2025

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: value

Artinya, 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        8

Akibatnya, 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.