phpcassaで、PHPからCassandraを操作する。

CQLを使って、CassandraをSQLライクに操作する。」に続いて、Cassandraをプログラムから操作してみます。
Cassandraの操作は、Apache Thriftという枠組みによっておこないます。
しかし、各言語にはラッパーライブラリが用意されているので、そういったライブラリを利用すると、Thriftを意識しなくても簡単にCassandraの操作ができます。

PHPクライアントライブラリphpcassa

PHPには、いくつかのCassandraのクライアントライブラリがあります。調べてみたところ、よく使われていそうなのは、phpcassaでした。
スクリーンショット 2014-04-05 13.23.12
phpcassa 1.0.a.6 Documentation — phpcassa v1.0.a.6 documentation
これも、ThriftによるCassandraの操作をラップしたライブラリです。
ライブラリのソースコードは、GitHubで、MITライセンスとして公開されています。
thobbs/phpcassa

phpcassaをプロジェクトに導入する。

さっそくプロジェクトに導入してみます。
プロジェクトをGitで管理している場合は、サブモジュールとして導入するのが良いと思います。

mkdir -p libs
git submodule add https://github.com/thobbs/phpcassa.git libs/phpcassa

または、GitHubに公開されているリリースバージョンからzipファイルをダウンロードして、プロジェクトディレクトリに導入することもできます。
Releases · thobbs/phpcassa
続いて導入したファイルを読み込みます。
読み込まなければならないのは、phpcassaのlibディレクトリ内のautoload.phpです。これを追加しておけば、あとの依存は自動で解決されます。

require_once (__DIR__ . '/lib/autoload.php');
use phpcassa\Connection\ConnectionPool;
use phpcassa\ColumnFamily;
use phpcassa\SystemManager;
use phpcassa\Schema\StrategyClass;

phpcassaのサンプルコードにならって、ネームスペースの解決も追加しておきます。

phpcassaで、Cassandraに接続

導入ができたら、実際に接続するコードを記述します。
ConenctionPoolクラスのコンストラクタの引数に、キースペースの名前と、接続先のホストを指定します。今回は、「分散データベースApache CassandraをMac OS Xにインストール」でインストールした、Mac OS XのローカルのCassandraへ接続します。

$connection_pool = new ConnectionPool('first_keyspace', array('127.0.0.1'));

接続したら、ColumnFamilyのオブジェクトも作成します。

$first_table = new ColumnFamily($connection_pool, 'first_table');

ここまで実行したところでエラーが出てしまいました。

$ php main.php
PHP Fatal error:  Uncaught exception 'cassandra\NotFoundException' in /Users/kataoka/Desktop/cassandra-php/lib/phpcassa/AbstractColumnFamily.php:200
Stack trace:
#0 /Users/kataoka/Desktop/cassandra-php/main.php(11): phpcassa\AbstractColumnFamily->__construct(Object(phpcassa\Connection\ConnectionPool), 'first_table')
#1 {main}
  thrown in /Users/kataoka/Desktop/cassandra-php/lib/phpcassa/AbstractColumnFamily.php on line 200

カラムファミリへの接続ができないというエラーですが、調べてみると、CQLのバージョンとカラムファミリの作り方に原因があるようです。
phpcassa: cassandra\NotFoundException when instantiating ColumnFamily class
ここでは、with compact storage句を追加して、カラムファミリを作り直します。

create table first_table (
name text PRIMARY KEY,
value text
) with compact storage;

これでエラーが出ずに接続ができました。

データを追加する。

続いて、Cassandraにデータを保存してみます。
ColumnFamilyクラスには、insertメソッドが定義されているので、これを利用します。

$first_table->insert('hoge', array('value' => 'fuga'));
$first_table->insert('piyo', array('value' => 'hage'));

ここで第1引数がプライマリキーとなっています。
ここまで実行したところで、CQLシェルでデータベースの状態を確認してみます。

cqlsh:first_keyspace> select * from first_table;
 name | value
------+-------
 piyo |  hage
 hoge |  fuga
(2 rows)

確かに保存されています!

データを削除する。

今度は挿入したデータを削除してみます。
削除には、removeメソッドを使用します。

$first_table->remove('hoge');

これも同様に第1引数がプライマリキーとなっています。CQLで試した時もプライマリキーの指定でしか削除ができませんでしたが、ここでもプライマリキーの指定以外での削除の方法はなさそうです。

cqlsh:first_keyspace> select * from first_table;
 name | value
------+-------
 piyo |  hage
(1 rows)

hogeキーのデータが削除されました!

データを更新する。

データの更新もしてみます。

$first_table->insert('piyo', array('value' => 'hogera'));

データの更新も挿入と同様にinsertメソッドでおこないます。
CassandraはKVSの一種なので、挿入と更新に区別がありません。だから、更新もinsertメソッドでおこないます。CQLは、insertとupdateの両方が用意されていますが、あれはSQLに合わせて用意されているだけで、実体は同じものであるとのことです。

cqlsh:first_keyspace> select * from first_table;
 name | value
------+--------
 piyo | hogera
(1 rows)

更新ができました!

データを取得する。

取得が最後になってしまいましたが、最後にさきほど更新したpiyoキーのデータを、phpcassaから取得してみます。
使用するのは、getメソッドです。

$result = $first_table->get('piyo');

引数には、例によって取得対象のプライマリキーを指定します。
返り値のデータを出力すると、保存した値が取得されていることが分かります!

array(1) {
  ["value"]=>
  string(6) "hogera"
}

どうやら結果にプライマリキーは含まれないようです。

まとめ

今回は、phpcassaを使ってプログラムからCassandraを操作してみました。
これで、Cassandraを起動して、PHPベースのWEBアプリケーションから利用する準備が整いました!
(Javaのクライアントライブラリの使い方に続くかもしれません。)

コメント

  1. […] という話題に踏み込んでいきます。→「phpcassaで、PHPからCassandraを操作する。」 […]

  2. […] 「phpcassaで、PHPからCassandraを操作する。」に続いて、今度はJavaからCassandraを操作してみます。 […]

タイトルとURLをコピーしました