Saat ini, saya sedang membangun sebuah aplikasi berbasis web (PHP) yang menggunakan Memcached sebagai bala bantuan untuk sistem caching-nya. Mengurangi load database sehingga performance selalu tinggi dan juga mengurangi ketergantungan terhadap database (seperti mysql, oracle, dll) untuk tempat penyimpanan sementara.
Apa itu memcache dan memcached (menggunakan huruf “D” dibelakang)? Menurutku, memcache adalah istilah umum dan memcached adalah daemon/service. Dan ternyata PHP juga memiliki ekstensi/modul/library bernama memcache dan memcached.
Tapi bukan penamaan memcache dan memcached yang membuatku bingung, yang membuatku bingung adalah ketika saya menggunakan salah satu ekstensi di atas untuk aplikasi web yang sedang saya bangun. Script (class) yang saya buat tidak dapat berkomunikasi dengan Memcached server dengan lancar. Script (class) tersebut adalah script utama (core) yang digunakan dalam sistem komunikasi antara aplikasi (PHP) dengan Memcached server.
Masalah itu muncul ketika saya menggunakan PHP Extension “memcache.so” dan menggunakan fungsi “get” untuk mendapatkan nilai di Memcached. Sistem yang saya bangun menggunakan model long polling request, dimana aplikasi akan melakukan hit ke Memcached server secara terus menerus tiap detik (seperti daemon atau service). Fungsi “get” tersebut kadang berhasil mengambil nilai di Memcached, dan kadang gagal (false). Kegagalan sering terjadi jika terdapat request yang super banyak (banyak thread/proses).
Untuk memperbaiki masalah itu, pertama saya buka script class yang saya buat, apakah ada algoritma yang salah untuk manajemen hit ke Memcached server-nya. Hasilnya saya yakin algoritmaku sudah benar. Kemudian berlanjut ke Memcached server-nya, install ulang Memcached dengan versi paling baru. Hasilnya masih sama, fungsi “get” kadang berhasil dan kadang gagal.
Akhirnya mencari permasalahannya menggunakan Google dan menemukan artikel tentang perbandingan antara PHP Extension “memcache” dan “memcached”. Dalam perbandingan menyebutkan bahwa keduanya mempunyai kemiripan, tapi untuk “memcached” memiliki banyak fitur fungsi. Tidak perlu menunggu banyak waktu lagi untuk meng-install ekstensi “memcached (memcached.so)” karena sudah cukup banyak pikiran dan waktu yang terpakai untuk memperbaiki masalah ini. Saya disini menggunakan CentOS 6.3 mode minimalis (CentOS 6.3 Minimalis Install) untuk server aplikasinya.
Install Komponen
$ yum install php-cli php-pear php-devel gcc-c++ zlib-devel
Install Libmemcached
PHP Extension memcached memiliki dependency pada Libmemcached, oleh karena itu kita harus meng-install Libmemcached terlebih dahulu. Pada saat tulisan ini dibuat, Libmemcached terbaru adalah versi 1.0.9.
$ wget https://launchpad.net/libmemcached/1.0/1.0.9/+download/libmemcached-1.0.9.tar.gz
$ tar -zxvf libmemcached-1.0.9.tar.gz
$ cd libmemcached-1.0.9
$ ./configure
$ make
$ make install
Install PHP Extension Memcached (memcached.so)
Download PHP Extension memcached dan meng-install-nya. Pada saat tulisan ini dibuat, PHP Extension memcached terbaru adalah versi 2.0.1.
$ pecl download memcached-2.0.1
$ tar -zxvf memcached-2.0.1.tgz
$ cd memcached-2.0.1
$ phpize
$ ./configure
$ make
$ make install
Tes
Ekstensi baru “memcached.so” sudah berhasil di-install, sudah di-load di “php.ini” dan saatnya menjalankan aplikasi. Hasilnya luar biasa, masalahnya sudah benar-benar hilang, saya tes dengan banyak proses mencapai 400 hit/detik ke Memcached server dan hasilnya masih normal.
Kesimpulan
Masalah fungsi “get” sebelumnya (gagal dalam mengambil nilai di Memcached) ternyata terselesaikan dengan penggantian ekstensi lain. Saya kurang tahu apakah ini sebuah bug di ekstensi “memcache (memcache.so)” atau karena faktor yang lain. Tetapi yang jelas, penggantian ekstensi ke “memcached (memcached.so)” sudah memberikan solusi tanpa terduga dan sangat luar biasa bagi saya.