Deskripsi masalah
Beberapa pengguna PHP melaporkan bahwa hasil uji performa terhadap ApsaraDB for Memcache tidak mencapai metrik performa yang diharapkan. Dalam sebagian besar kasus, aplikasi mengakses ApsaraDB for Memcache melalui layanan web Apache dan menggunakan koneksi singkat. Setiap koneksi singkat memerlukan biaya lebih tinggi daripada rekoneksi socket biasa karena juga menjalankan prosedur re-autentikasi yang kompleks. Biaya ini jauh lebih besar daripada biaya permintaan biasa, sehingga secara signifikan mengurangi efisiensi situs web Anda.
Solusi
Oleh karena itu, kami menyarankan Anda mengganti koneksi singkat dengan koneksi persisten. Namun, ApsaraDB for Memcache memerlukan ekstensi PHP Memcached—yang berbeda dari ekstensi memcache—dan tidak menyediakan antarmuka pconnect. Langkah-langkah berikut menunjukkan cara mengatur koneksi persisten dalam PHP.
Menurut dokumentasi resmi PHP Memcached:
Description
Memcached::__construct ([ string $persistent_id ] ) Creates a Memcached instance representing the connection to the memcache servers.
Parameters
persistent_id By default the Memcached instances are destroyed at the end of the request. To create an instance that persists between requests, use persistent_id to specify a unique ID for the instance. All instances created with the same persistent_id will share the same connection.
Artinya, Anda dapat berbagi koneksi dengan meneruskan persistent_id yang sama ke konstruktor. Berikut contoh kodenya:
<?php
$memc = new Memcached('ocs');// 'ocs' di sini adalah persistent_id
if (count($memc->getServerList()) == 0) /* Periksa sebelum membuat koneksi */
{
echo "New connection"."<br>";
/* Simpan semua opsi di dalam kondisi ini, karena beberapa opsi menyebabkan rekoneksi dan mengubah koneksi persisten menjadi koneksi singkat. */
$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 yang menambahkan penundaan tetap 40 ms ketika nilai yang Anda ambil tidak ada. Aktifkan opsi ini untuk menghindari bug tersebut.
/* Kode addServer juga harus tetap berada di dalam kondisi ini. Jika tidak, Anda akan membangun kembali kolam koneksi 'ocs', yang dapat menyebabkan exception pada program client PHP. */
$memc->addServer("your_ip", 11212);
$memc->setSaslAuthData("user", "password");
}
else
{
echo "Now connections is:".count($memc->getServerList())."<br>";
}
$memc->set("key", "value");
echo "Get from OCS: ".$memc->get("key");
//$memc->quit();/* Jangan pernah tambahkan quit di akhir kode. Jika tidak, koneksi akan menjadi koneksi singkat. */
?>
Tiga poin penting dalam kode di atas telah ditandai dengan komentar. Kata kunci ocs dalam konstruktor berfungsi sebagai kolam koneksi: setiap bagian kode yang memerlukan koneksi memanggil new Memcached('ocs') dan mengambil satu koneksi dari kolam tersebut.
Hasil
Letakkan kode di atas di direktori kerja Apache /var/www/html/, beri nama test.php, lalu akses http://your_ip:80/test.php melalui browser. Untuk 8 permintaan pertama, browser menampilkan output berikut:
New connection
Get from OCS: value
Hal ini menunjukkan bahwa masing-masing dari 8 permintaan pertama membuat koneksi baru, sedangkan setiap permintaan berikutnya menggunakan ulang salah satu dari 8 koneksi tersebut. Pengambilan paket juga menunjukkan bahwa seluruh lalu lintas setelah permintaan ke-8 berjalan melalui koneksi persisten tanpa rekoneksi socket maupun autentikasi.
Mengapa jumlah koneksi tersebut tepat 8? Berkas konfigurasi httpd.conf menunjukkan bahwa Apache memulai 8 proses anak:
#StartServers: numbers of server processes to start
StartServers 8
Dengan demikian, kolam koneksi dengan persistent_id ocs menginisialisasi tepat 8 koneksi, dan semua permintaan selanjutnya menggunakan ke-8 koneksi tersebut.
Selanjutnya, uji navigasi halaman. Salin berkas PHP tersebut dan gunakan ocs sebagai persistent_id pada konstruktor yang membuat koneksi. Permintaan berpindah dari satu koneksi ke koneksi lain karena ditangani oleh proses anak Apache yang berbeda, tetapi tidak terjadi autentikasi ulang maupun rekoneksi socket. Hal ini membuktikan bahwa pengaturan koneksi persisten PHP Memcached berfungsi dengan baik. PHP-FPM merupakan mode yang biasa kami gunakan: proses FPM mempertahankan koneksi persisten ke server Memcached, sehingga siklus hidup koneksi tersebut sejalan dengan siklus hidup proses Apache.