Implementasi CouchDB dan Memcached di PHP

Asumsi saya pembaca tau bedanya RDBMS dan NoSQL, dan familiar dengan system caching, khususnya memcached. Jika memang belum tau perbedaannya bisa pelajari dasar-dasar NoSQL disini http://nosql-database.org dan untuk memcached bisa baca-baca disini https://en.wikipedia.org/wiki/Memcached

Untuk bisa implementasikan 3 tech CouchDB, Memcached & PHP, tentu harus mempersiapkan instalasinya kan? Benar sekali :). Harus download CouchDB, install memcached extension dan web server. Pengguna mac dan nginx dapat install via homebrew bisa ikuti caranya disini http://blog.frd.mn/install-nginx-php-fpm-mysql-and-phpmyadmin-on-os-x-mavericks-using-homebrew lengkap dan mudah dipahami.

Installing CouchDB

Untuk instalasi CouchDB ikuti dari dokumentasi-nya https://wiki.apache.org/couchdb/Installation atau download langsung dari sini http://couchdb.apache.org/#download. Versi CouchDB yang saya gunakan adalah versi 1.6.1.

CouchDB Futon

Futon merupakan administration interface built-in CouchDB, Jika familiar dengan PHPMyAdmin. maka Futon sama seperti PHPMyAdmin fungsinya. anda dapat manage databases dengan mudah.

futon

Kita dapat manage user via Futon, agar tidak sembarang user bisa akses. untuk artikel ini tidak diperlukan maka skip aja dulu. untuk mengakses Futon buka lewat url berikut http://127.0.0.1:5984/_utils/

Membuat database

Buat database sangat mudah, bisa gunakan futon, klik ‘create database‘ selanjutnya didalam database anda dapat membuat document.

Membuat document

contoh buat document via curl

$ curl -X POST http://127.0.0.1:5984/testcase/ -d '{"username": "rifki", "email": "hello@example.com", "status": 1 }' -H "Content-Type: application/json"

Output:

{"ok":true,"id":"fe775af6126f0821719dabf8ec001b19","rev":"1-830fa77e093967d298d854eaaedde61c"}

check di futon, maka document yang baru dibuat didalam database ‘testcase‘ akan terlihat.

Retrieving Documents

Menampilkan document berdasarkan id

$ curl -X GET http://127.0.0.1:5984/testcase/fe775af6126f0821719dabf8ec001b19

Output:

{"_id":"fe775af6126f0821719dabf8ec001b19","_rev":"1-830fa77e093967d298d854eaaedde61c","username":"rifki","email":"hello@example.com","status":1}

Menampilkan semua document:

$ curl -X GET http://127.0.0.1:5984/testcase/_all_docs?include_docs=true

Output:

{"total_rows":1,"offset":0,"rows":[{"id":"fe775af6126f0821719dabf8ec001b19","key":"fe775af6126f0821719dabf8ec001b19","value":{"rev":"1-830fa77e093967d298d854eaaedde61c"},"doc":{"_id":"fe775af6126f0821719dabf8ec001b19","_rev":"1-830fa77e093967d298d854eaaedde61c","username":"rifki","email":"hello@example.com","status":1}}

Setiap update document, otomatis generate baru revisi “_rev”. contoh menampilkan document dengan revisi tertentu:

$ curl -X GET http://127.0.0.1:5984/testcase/fe775af6126f0821719dabf8ec001b19?rev=1-830fa77e093967d298d854eaaedde61c

Update Documents

Update document berdasarkan id dan spesifik revisi.

$ curl -X PUT http://127.0.0.1:5984/testcase/fe775af6126f0821719dabf8ec001b19 -d '{"_rev": "1-830fa77e093967d298d854eaaedde61c", "username": "rifki", "email": "hello@example.com", "status": 0}' -H "Content-Type: application/json"

Output:

 "username": "rifki", "email": "hello@example.com", "status": 0}' -H "Content-Type: application/json" {"ok":true,"id":"fe775af6126f0821719dabf8ec001b19","rev":"2-8a0bd609a1d5eeb6414e09c2d9e00ff7"}

Revisi sangat berguna, bisa dibilang fitur penting dari CouchDB ketika document sudah update, lalu kita perlu mengembalikan document sebelumnya dengan spesifik revisi. revisi di CouchDB ini sebagai version control, Fungsi ini sering dibutuhkan ketika document terlanjur terhapus, tapi kita butuh mengembalikan document-nya.

Delete Document

$ curl -X DELETE http://127.0.0.1:5984/testcase/fe775af6126f0821719dabf8ec001b19?rev=2-8a0bd609a1d5eeb6414e09c2d9e00ff7

Output:

{"ok":true,"id":"fe775af6126f0821719dabf8ec001b19","rev":"3-86a0dd810af34bdd9325acbfca4fce35"}

delete document tanpa spesifik revisi:

$ curl -X DELETE http://127.0.0.1:5984/testcase/fe775af6126f0821719dabf8ec001b19

Replication

Code snippet replication database.

kita akan melakukan export database db_name.json dari server. setelah itu di import dari server ke local server kita. berikut snippet-nya:

Export
$ curl -d @db_name.json -H "Content-Type: application/json" -X POST http://127.0.0.1:5984/db_name/_bulk_docs

Import
$ curl -H 'Content-Type: application/json' -X POST http://user:password@localhost:5984/_replicate -d ' {"source": "http://user:password@server.com:5984/db_name", "target": "http://user:password@localhost:5984/db_name", "create_target": true, "continuous": true}'

Lengkapnya tentang replication baca disini https://wiki.apache.org/couchdb/Replication

Views

View digunakan untuk mengambil data, seperti fungsi SELECT pada SQL. Views menggunakan perintah javascript untuk memfilter data yang akan ditampilkan.

Untuk contoh pembuatan Views, buka url http://127.0.0.1:5984/_utils/database.html?testcase/_temp_view. Merupakan filter temporary/tidak akan disimpan jika tidak di ‘save’.

pada View Code ubah seperti code dibawah ini, lalu jalankan dengan klik tombol Run.

function(doc) {
  if (doc.status === 1) {
    emit(doc.username, doc);
  }
 }

create design & view

Jangan lupa disimpan, agar bisa digunakan kembali views yang telah dibuat.

Memcached dan PHP

Untuk bisa menjalankan memcached di PHP, harus install terlebih dahulu. caranya bisa menggunakan homebrew. install keduanya atau salah satu.

brew install php56-memcached
brew install php56-memcache

Masukan di php.ini:

extension=memcached.so
extension=memcache.so

Lalu restart nginx/apache. Jika pake php-fpm harus restart juga. Pastikan memcached/memcache sudah muncul di phpinfo.

memcache-info

Sebagai catatan, memcached dan memcache dua hal yang ‘beda’, untuk perbedaannya lihat disini https://code.google.com/p/memcached/wiki/PHPClientComparison#PHP_Client_Comparison. Menurut pendapat saya keduanya secara fitur/fungsi sama tidak jauh berbeda :).

Membuat blog engine, menggunakan CouchDB, Memcached dan PHP

Kita akan membuat sebuah blog, sekarang kita akan memperisapkan membuat 1 buah database dan 2 buah document via Futon.

  1. Buat sebuah database di couchDB, testcase_blog
  2. document pertama strukturnya adalah title, body, category dan created_at. yang merupakan data yang akan disimpan dari blog engine kita. untuk docs yang pertama ini tidak perlu dibuat via Futon.
  3. document kedua, harus dibuat. karena kita akan membuat document design & view. kenapa harus buat design & view? secara sederhana berguna untuk mem-filter data yang akan kita tampilkan.

Berikut code Design (including View) yang kita buat;

Untuk hidup lebih mudah 🙂 kita membutuhkan PHP library(Client Library) untuk berinteraksi dengan couchDB. download sini PHP-on-Couch lalu extract, copy satu folder lib yang didalamnya terdapat 3 file(couch.php, couchClient.php dan couchDocument.php). simpan ke directory project kita.

dir-projects

Directory Project

Sekarang buat 2 file php. index.php dan bootstrap.php

File bootstrap.php

File index.php

Blog yang kita buat ini menggunakan cache 1 menit didalam memory, ketika kita menambahkan artikel/delete menunggu satu menit hingga cache hilang dari memory.

Code lengkap ini dapat diunduh di repo github saya disini https://github.com/rifki/example-couchdb-memcache-php. Let’s discuss 🙂

Sumber bacaan lain:
CouchDB Definitive Guide
CoucDB Docs