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の値を扱うことが可能になります。
コメント
コメントフォーム
トラックバックURI
最近の記事
システム開発エンジニア募集! [2012年02月03日 : 小林有佳]
OpenVPNで細々便利な設定 [2012年01月31日 : 門脇優児]
【iOS】Viewの開発・デバッグに役立つ色々 [2012年01月23日 : 中川善樹]
PHPDocumentorの利用方法まとめ [2012年01月19日 : 笹亀弘]
Google Chart Toolsを使ってサイトマップを描こう! [2011年12月21日 : 志田仁美]
stumpwm設定v2 [2011年12月19日 : 門脇優児]
Mashup Awards 7の授賞式が行われました [2011年12月16日 : 中川善樹]
社員旅行に行きました [2011年12月12日 : 大橋寛子]
iCloud風のアイコンを作成する(Fireworks) [2011年12月07日 : 和田記光]
iScroll4でネイティブに近いスマホ向けHTMLページを作成する [2011年12月02日 : 松田惇]













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