symfonyでMongoDBを使ってみました
こんにちは。笹亀です。
最近でも無いですが、なにかと注目を浴び続けているのがkey-valueストアです。TokyoTyrant, kumofs, ROMA, Flareなど種類も豊富で使用する用途によって使い分けするのがよいです。そんな中で自分がご紹介したいのはMongoDBです。
MongoDBはドキュメント指向データベースでNoSQLです。ご紹介理由としてはRDBMSから入るkey-valueストアとしてとてもわかりやすいからです。後はサポート言語が大量にあってWEBアプリケーションとして使用するのにとても相性がよいことです。
※PHP、Python、Ruby、Perlなどなど
その他にたくさんの特徴があります。詳細については、下記のドキュメントにてご確認ください。
http://www.mongodb.org/display/DOCSJP/Home
※日本人なら日本語のドキュメントに限ります(一部英語のままらしい)
まずはインストールしてみます。下記から自分の環境にあったものをダウンロードします。
http://www.mongodb.org/display/DOCS/Downloads
自分の場合はMacの10.6なので下記のように取得します
解凍してコマンドなどを設置(コピー)します。
mongoデーモンをデータの格納先を指定して起動します。
PHPからMongoDBを使えるようにします。
phpinfoでMongoが設定が反映されているか確認しましょう。

以上でPHPでMongoDBが使えるところまでいけます。
symfony(PHP)で使用する方法を記載します。まずは接続情報を記載します。MongoDBはスケーラブルに対応しておりますので今回はMaster-Slaveの情報の両方を記載します
config/mongo/databases.yml
次にsymfonyでMongoへ登録、取得(件数のみ)するためのクラスを作成します。
lib/MongoKeyValue.class.php
準備ができたら実際にactionに記載して登録処理と件数を取得するものを作成して確認してみましょう。

usleepしている箇所についてですが、Mongoで連続で登録してカウントの処理をするときに、Lock処理が入りませんので、登録処理を完了する前に件数を取得する部分が発行してしまい件数が合わない場合があります。そのためにsleepで処理を止めています。
カウント取得しているものには条件を指定します。ここではカウント取得条件はclass_idが1である件数を取得しています。また、MongoDBはPHPとは違い数値と文字列の数値を区別する必要がありますので、カウントを取得する際などには注意が必要です。
MySQLなどのようにMongoにもコマンドで実行して値を確認する方法もあります。使用するコマンドは「mongo」コマンドから値を操作することができます。

mongoの基本的なコマンドしか実行しておりませんので、その他にどういったものがあるかはコマンドのhelpで確認するか、ドキュメントよりご確認いただけたらと思います。
symfonyでMongoクラスを作成しましたが、こちらには登録処理とカウントする処理しかありません。その他にも削除する処理やデータを取得するものを拡張していただければ自由にMongoDBの値を扱うことが可能になります。
最近でも無いですが、なにかと注目を浴び続けているのがkey-valueストアです。TokyoTyrant, kumofs, ROMA, Flareなど種類も豊富で使用する用途によって使い分けするのがよいです。そんな中で自分がご紹介したいのはMongoDBです。
MongoDBはドキュメント指向データベースでNoSQLです。ご紹介理由としてはRDBMSから入るkey-valueストアとしてとてもわかりやすいからです。後はサポート言語が大量にあってWEBアプリケーションとして使用するのにとても相性がよいことです。
※PHP、Python、Ruby、Perlなどなど
その他にたくさんの特徴があります。詳細については、下記のドキュメントにてご確認ください。
http://www.mongodb.org/display/DOCSJP/Home
※日本人なら日本語のドキュメントに限ります(一部英語のままらしい)
まずはインストールしてみます。下記から自分の環境にあったものをダウンロードします。
http://www.mongodb.org/display/DOCS/Downloads
自分の場合はMacの10.6なので下記のように取得します
- wget
http://downloads.mongodb.org/osx/mongodb-osx-x86_64-1.4.1.tgz
解凍してコマンドなどを設置(コピー)します。
- tar
zxvf mongodb-osx-x86_64-1.4.1.tgz - cd
mongodb-osx-x86_64-1.4.1 - sudo
cp bin/* /usr/bin/ - sudo
cp -r include/* /usr/include/ - sudo
cp lib/libmongoclient.a /usr/lib/
mongoデーモンをデータの格納先を指定して起動します。
- mongod
--dbpath ~/mongodb &
PHPからMongoDBを使えるようにします。
- pecl
install mongo - php.iniにextensionの箇所にmongo.soを追加する
- apacheを再起動。
phpinfoでMongoが設定が反映されているか確認しましょう。
以上でPHPでMongoDBが使えるところまでいけます。
symfony(PHP)で使用する方法を記載します。まずは接続情報を記載します。MongoDBはスケーラブルに対応しておりますので今回はMaster-Slaveの情報の両方を記載します
config/mongo/databases.yml
- all:
master: param: dsn: localhost:27017 dbname: test slave: param: dsn: localhost:27017 dbname: test
次にsymfonyでMongoへ登録、取得(件数のみ)するためのクラスを作成します。
lib/MongoKeyValue.class.php
- class
MongoKeyValue - {
protected $connection_master = null; protected $connection_slave = null; protected $table_name = null; /** * コンストラクト * * @param string $table_name * @return MongoKeyValue */ public function _construct($table_name = '') { $this->table_name = $table_name; //コネクション情報をセット(Master&Slave $file = sfConfig::get('sf_config_dir').'/mongo/databases.yml'; if (file_exists($file)) { $config = sfYaml::load($file); } else { throw new InvalidArgumentException('not mongo databases.yml'); } $getDb = function ($name) use ($config) { $param = $config['all'][$name]['param']; $mongo = new Mongo($param['dsn']); return $mongo->selectDB($param['dbname']); }; //コネクションをセット $this->connection_master = $getDb('master'); $this->connection_slave = $getDb('slave'); } public function getMasterCollection() { return $this->connection_master->selectCollection($this->table_name); } public function getSlaveCollection() { return $this->connection_slave->selectCollection($this->table_name); } /** * データインサート処理 * * @param array $params * @return boolean */ public function setKeyValue($params) { if (is_array($params)) { $result = $this->getMasterCollection()->insert($params); return $result; } else { return false; } } /** * 条件を設定してデータ件数を取得する * * @param array $params 取得条件 * @return integer */ public function getKeyValue($params) { if (is_array($params)) { return $this->getSlaveCollection()->count($params); } else { return false; } } - }
準備ができたら実際にactionに記載して登録処理と件数を取得するものを作成して確認してみましょう。
- public
function executeTest() { $mongo = new MongoKeyValue('test_table'); $params['class_id'] = "1"; $params['name'] = '笹亀弘'; $mongo->setKeyValue($params); $params1['class_id'] = "1"; $params1['name'] = 'ささがめひろし'; $mongo->setKeyValue($params1); $params2['class_id'] = "2"; $params2['name'] = 'ささがめひろし'; $mongo->setKeyValue($params2); usleep(1000000); $params3['class_id'] = "1"; print $mongo->getKeyValue($params3); exit; }
usleepしている箇所についてですが、Mongoで連続で登録してカウントの処理をするときに、Lock処理が入りませんので、登録処理を完了する前に件数を取得する部分が発行してしまい件数が合わない場合があります。そのためにsleepで処理を止めています。
カウント取得しているものには条件を指定します。ここではカウント取得条件はclass_idが1である件数を取得しています。また、MongoDBはPHPとは違い数値と文字列の数値を区別する必要がありますので、カウントを取得する際などには注意が必要です。
$params3['class_id'] = "1"; print $mongo->getKeyValue($params3); 結果: 2 $params4['class_id'] = 1; print $mongo->getKeyValue($params4); 結果: 0
MySQLなどのようにMongoにもコマンドで実行して値を確認する方法もあります。使用するコマンドは「mongo」コマンドから値を操作することができます。
mongoの基本的なコマンドしか実行しておりませんので、その他にどういったものがあるかはコマンドのhelpで確認するか、ドキュメントよりご確認いただけたらと思います。
symfonyでMongoクラスを作成しましたが、こちらには登録処理とカウントする処理しかありません。その他にも削除する処理やデータを取得するものを拡張していただければ自由にMongoDBの値を扱うことが可能になります。
コメント
コメントフォーム
トラックバック
最近の記事
- もうすぐ健康診断があるんだ・・・ [2010年09月02日 : 阿部恵]
- Photoshopで壁紙を作りながら、基本的な使い方を覚える [2010年09月01日 : 鴨田健次]
- はじめての共同作業 Canvas編 (node.js + websocket) [2010年09月01日 : 中川善樹]
- 「PHP×Flex(後編)」PHPテクニカルセミナー(無料)第4弾の募集を開始しました!! [2010年08月26日 : 和田記光]
- 【HTML5】Canvasでお絵かきしてみた(前編) [2010年08月25日 : 橋本章史]
- MacにgroongaのMySQL用ストレージエンジン [2010年08月23日 : 笹亀弘]
- Appleのサイトで見たiPhone4をFireworksで描いてみました-1/2 [2010年08月19日 : 和田記光]
- iPad版の会社紹介を作ってみました [2010年08月19日 : 小林有佳]
- iPhoneアプリ開発開始時に気をつけるべきファイルの取り扱い (2) [2010年08月19日 : 亀本大地]
- symfonyセミナー動画無料公開! [2010年08月13日 : 岡本雄樹]



細かいツッコミで申し訳ないのですが、Flareはストレージ部分にTokyo Cabinetを使っているはずなので、そのレイヤーで記述するのであればTokyo Cabinet部分はTokyoTyrantになるんじゃないかと思いますがいかがでしょう。
ご指摘どおりです。
あまり深く考えずに記載をさせていただきましたので、
申し訳ございませんでした。
修正をさせていただきました。