PHPとCouchDB

ドキュメント志向データベースだとMongoDBが盛り上がっていますが、CouchDBもまだまだ要チェックだと思っています。PHPと共に使う場合、MongoDBへはPHPの標準ライブラリ経由でいいと思いますが、CouchDBにはRESTでアクセスします。この点、余計なHttp接続コストを払って・・云々といった話はあります。既存の3層構造に当てはめればそうですが、最近のクライアント重視な考え方では必ずしもロスにはならない、むしろメリットの方が大きいケースもあると思います。RDBライクなクエリが使えるMongoDBは確かに現在のアーキテクチャのまま永続化層として使用しても違和感がありません。しかしフロントエンドでのパフォーマンス、リソース設計を考えるとCouchDBの特徴を生かしたシステム設計には捨てがたい魅力があります。それについてはまた後日ログを残そうと思いますが、今日はとりあえずPHPからCouchDBに接続するには、です。

CouchDBを触る

とりあえず、一通りはCouchDBでアプリっぽい物を作ってみた方がいいと思っています。PHPからいきなり繋ごうとすると既存のデータ層とのギャップばかりに目が行ってしまって、CouchDBの世界が見えないからです。とくに、MongoDBならRDBライクなクエリが使えますが、CouchDBではMap Reduceでviewを作るというのが基本になります。私はもともとRDBに動的なクエリを打つ趣味はなく、検索はluceneでいいよねと思っているので全く苦になりませんでした。Javascriptflexなどからグリッド用のデータソースを要求する程度ならviewに基本的な処理クエリが用意されているので複雑な結合を要する場合(てかそんなことはMongoでもやらないと思いますが)を除けば十分に対応できます。
私は最初は付属?というか公開されているサンプルブログアプリを触ってみて、既存のjsベースの自前ライブラリから繋げて遊んでみました。なかなかおもしろいです。(具体的には内容がクソなのでご容赦くださいw)

基本的なリソース
ソーシャルとかデータマイニングとか解析とか

PHPからCouchDBに接続する

PHPCouchDBの連携には、HTTPサーバー -> PHP をベースとしてアプリを構築し、永続化層としてCouchDBを置き、PHPから接続するというパターンと、CouchDBをフロントエンドにして、一部の処理を外部プロセスとしてPHPに接続するという逆のパターンがあります。通常は前者の利用法が紹介されることが多いです。
CouchDBをフロントにしてPHPに接続するには、FastCGIPHPを用意して、CouchDB側でvirtualhostと_rewriteを設定する方法が使えることは確認しました。高速なviewをCouchDBで提供し、既存のアプリケーションに接続したいときはPHPに繋ぐというのもありかな。
とりあえず、ここではPHPからCouchDBに接続するには、です。
CouchDBのwikiにサンプルコードが出ています。これを参考にしてもいいですし、一部手を抜くなら、Zend_Http_ClientとZend_Jsonを使うとスッキリするかもしれません。手作業を省略して↓にリストアップしたライブラリのどれかを使うというほうが手っとり早いかもしれません。基本的にはRESTに接続して帰って来たJSONを使う、JSONでリクエストを出すといったところですが、エラー処理やリクエストの準備などで違いが出るかどうか。やってみると、ZFで新しくリリースされたZend_Config_Jsonと合わせて、コンフィグサーバーとしてのみ使うというのも有りだと思います。高度に抽象化されたアプリケーションを作っていれば、ZFアプリをプラットフォームやサービスとして提供とかも可能ですね。

リンクなど

ここでリストアップしたように、CouchDBPHPから接続するライブラリは意外と充実しています。
既存のPHP製Frameworkとの連携を考えると、Doctrine-CouchDBもよさそうですし、Sag for CouchDB もドキュメントがしっかりしているので最初に試すにはよいかもしれません。
私が最初に試したのはZend Frameworkでおなじみの方が書いているこれですが、

ZF1と連動させてシンプルに試したいときはいいかもしれません。