EC-CUBEのセッション管理をMongoDBにしてみる

2014年1月31日

eccube

EC-CUBEではsession管理をDBで行っています。
しかし、デフォルトのバグがあり、高負荷状態になるとデッドロックがおきデータベースが落ちてしまうことがあります

http://svn.ec-cube.net/open_trac/ticket/571

そこでKVSを使って解決できないものか試してみました。

MongoDBのインストール方法

色々なとこに書かれているので参考にしてください
CentOS5.5にMongoDBをインストールしてみる – 今日も適当ダイアリー
http://labs.s-cubism.com/blog/2010/07/20/199/
CentOSにmongodbをインストールしてみる with php – イノベートな非日常

EC-CUBEに組み込む

参考に、というかまんま使わせていただきました
PHPとMongoDBでセッション管理してみる – 今日も適当ダイアリー

~~~
true);
if (self::$persist) $options[‘persist’] = self::$persist;

// MongoDBへ接続
self::$mongo = new Mongo(self::$server, $options);
if (self::$mongo->connected) {
self::$col = self::$mongo->selectDB(self::$db)->selectCollection(self::$collection);
}

return self::$mongo->connected;
}

/**
* セッションの操作が終了した際に実行されます
*
* @return bool 成功した場合に TRUE を、失敗した場合に FALSE を返す
*/
public static function sfSessClose()
{
return true;
}

/**
* 保存されたセッションデータを読み込みます
*
* @param string $id セッションID
* @return string セッションデータを返します
*/
public static function sfSessRead($id)
{
if (!self::$col) return ”;
$item = self::$col->findOne(
array(‘_id’ => $id), array(‘data’ => true)
);

return (string) $item[‘data’];
}

/**
* セッションデータを保存します
*
* @param string $id セッションID
* @param string $sess_data セッションデータ
* @return bool 成功した場合に TRUE を、失敗した場合に FALSE を返す
*/
public static function sfSessWrite($id, $sess_data)
{
if (!self::$col) return false;
return self::$col->save(array(
‘_id’ => $id,
‘data’ => $sess_data,
‘ts’ => new MongoDate() // タイムスタンプ
), array(‘safe’ => true));
}

/**
* セッションが session_destroy() で破棄された際に実行されます。
*
* @param string $id セッションID
* @return bool 成功した場合に TRUE を、失敗した場合に FALSE を返す
*/
public static function sfSessDestroy($id)
{
return self::$col->remove(
array(‘_id’ => $id), array(‘justOne’ => true)
);
}

/**
* ガベージコレクタが実行されたときに実行されます。
*
* @param int $maxlifetime 最大有効期間
* @return bool 成功した場合に TRUE を、失敗した場合に FALSE を返す
*/
public static function sfSessGc($maxlifetime = MAX_LIFETIME)
{
return self::$col->remove(
array(
// 現在日時より $maxlifetime 以上古いデータは無効
‘ts’ => array(‘$lt’ => new MongoDate(time() – $maxlifetime))
)
);
}
}
~~~

こっちを使おうと思ったら動かなかった。。
JQueryin | MongoSession – A PHP MongoDB Session Handler

確認する

商品をカゴに入れます。((上記を行って最初に画面を開くとDBが作られるので動作が重たいです。))
ちゃんとカゴに商品が入ること、購入遷移が正しく行えることが確認できれば問題ないと思います。

実験的に試してみましたが思ったより簡単に動きました。
今後負荷試験や実際に運用することがあればまた記事にしたいと思います。