CouchbaseServerを触ってみよう -KVSとして利用してみよう-

CouchbaseServerを触ってみよう
4章 CouchbaseをKVSとして利用してみよう
======================================

この記事は、SoftwareDesign 2016年12月号(以下、SD誌)のKVS特集中のCouchbaseServer紹介記事に関する補足記事となります。
CouchbaseServerの簡単な紹介から、実際に手を動かして利用してみるところまでを対象としています。

Couchbaseサーバに関する公式のドキュメントは大量にあるのですが、バージョンが古いものも大量に残っていたり、リンク切れなどがあるため、まずざっくり触ってみたいというときに参考にして頂きたいと思います。
この記事はCouchbase4.5を元に記載しています。

[Indexはこちら](http://qiita.com/taruhachi/items/0f96a2f7da81383866df)


# KVSとしての利用
## スクリプトからの利用(PHP)
ここではサンプルとしてPHPからの利用例を紹介します。
PHPからCouchbase を利用するためには以下の準備が必要です。
http://developer.couchbase.com/documentation/server/current/sdk/php/start-using-sdk.html


    # Only needed during first-time setup:
    wget http://packages.couchbase.com/releases/couchbase-release/couchbase-release-1.0-2-x86_64.rpm
    sudo rpm -iv couchbase-release-1.0-2-x86_64.rpm
    # Will install or upgrade existing packages
    sudo yum install libcouchbase-devel gcc gcc-c++ php-devel
    sudo pecl install couchbase


私の環境では以下のエラーが出たこととphp5.6をインストールしていたため、少し変更しています。

    fatal error: zlib.h: No such file or directory

    sudo yum install libcouchbase-devel gcc gcc-c++ php56-devel zlib-devel


その後、php.iniにcouchbse.soを組み込み、Apacheを再起動します。

    sudo echo "extension=couchbase.so" > /etc/php.d/couchbase.ini
    sudo /etc/init.d/httpd restart

以下、先ほど作成したバケットにドキュメントを格納するサンプルです
このサンプルでは、CouchbaseBucket::upsert()命令を利用して、元のドキュメントが無かった場合には新規追加、合った場合には上書きを実行しています。
PHP上のarray()データ構造をそのままJSONとしてシリアライズして格納しているため、Couchbase上ではJSONであることを意識しないものとなっています。

    vi cb_test.php
    
    <?php
    define("BUCKET_NAME",          "sample");
    define("BUCKET_PASSWD",        "password");
    
    // Connect to Couchbase 
    $cluster = new CouchbaseCluster("localhost");
    $bucket = $cluster->openBucket(BUCKET_NAME, BUCKET_PASSWD);


    // Store a document
    echo "Upsert U:Taru8\n";
    $result = $bucket->upsert(
        'U:Taru8',
        [
            "doctype"     => "USER",
            "email"       => "taruhachi@***.**",
            "sex"         => "male",
            "birthday"    => "1975-08-08",
            "u_timestamp" => time()
        ],
    ['expiry'=>30]
    );
    print_r($result);

    echo "Get U:Taru8\n";
    $result = $bucket->get("U:Taru8");
    print_r((array)$result->value);
    ?>

スクリプト実行結果

    $ php cb_test.php

    Upsert U:Taru8
    CouchbaseMetaDoc Object
    (
        [error] =>
        [value] =>
        [flags] =>
        [cas] => 2445gkpq8k
        [token] =>
    )
    Get U:Taru8
    Array
    (
        [doctype] => USER
        [email] => taruhachi@***.**
        [sex] => male
        [birthday] => 1975-08-08
        [u_timestamp] => 1474152241
    )

※ドキュメントのキーおよびドキュメント双方にドキュメントのデータ区分がわかるようにしておくと管理コンソールの利用時、N1QL利用時などに便利です。
ここではドキュメントのキーのプレフィックスを"U:"とし、doctype="USER"をドキュメントに含めています。

管理コンソールでもDocumentに追加されていることが確認されました。

![cms_07.png](https://qiita-image-store.s3.amazonaws.com/0/38018/427baf24-9965-4828-714a-c4df3996d7d8.png)


また、expiryとして30秒を指定しているため、30秒後には自動で削除されることも確認できます。

CouchbaseBucketに対する主要なMethodは以下の通りです。
上記サンプルスクリプトを改修しながら色々な挙動を試していただきたいと思います。

![php_methods_01.png](https://qiita-image-store.s3.amazonaws.com/0/38018/e1552818-ffa3-3f5c-c002-715622482748.png)


詳しくは
http://docs.couchbase.com/sdk-api/couchbase-php-client-2.2.2/
を参照下さい。