開発2部の吉岡です。
PHPでソーシャルゲームを作っている会社は多いかと思うのですが、
オーツーでは、自分たちでフレームワークを作って開発を行っています。
既存のフレームワークを使わなかったのは、データベースやキャッシュ用のKVSを柔軟に使いたかったという理由と、単純に技術力の向上目的です。
高負荷なゲームもコイツを使っていますが、なかなか良い感じで使えています。
パフォーマンスに問題があっても、ブラックボックス化したコードがないので、原因の調査もしやすいです。
フレームワークの中身
このフレームワークの内容をざっくり分けると下のような感じです。
ActionHandler
リクエストURLから、呼び出すActionクラス決定します。
Action
リクエストに合った処理を行います。
具体的には、Logicの呼び出し、その返却値を元に出力する内容をまとめます。
また、Validationやデータベースコネクション等で発生した例外を一手にcatchして対応した処理を行います。
例えばこんな感じ(かなり端折っていますが…)
class ActionRegist extends _Action { protected function doAction(){ //リクエストクエリからユーザー名とパスワードを取得 $user_name = $this->getQuery('user_name'); $user_password = $this->getQuery('user_password'); //LogicPerson::registを呼び出し登録処理を行う //$this->master_dbは、マスターDBサーバーへのコネクションクラス LogicPerson::regist( $this->master_db, $user_name, $user_password ); // 出力パラメータにOKを追加 $this->Output->assign('result', 'ok'); } }
Logic
主にSQLを作成し、データベースとやりとりします。
このクラスはstaticに呼び出されます。なので、メソッドも全てstaticです。
こうすることで、Actionクラスからの呼び出しだけではなく、他の処理からもLogicクラスを呼び出しやすくしています。具体的には、デバッグスクリプトやバッチ処理なんかが作りやすいです。
例えばこんな感じ
class LogicPerson extends _Logic { static public function regist( _DatabaseAccess $DatabaseAccess, $user_name, $user_password){ //データベースコネクションクラス(_DatabaseAccess)のinsertを呼び出して、データを挿入する if ( $DatabaseAccess->insert( 'person', $user_name, $user_password )){ return true; } else { return false; } } }
DatabaseAccess
Actionクラスの初期処理でインスタンス化される、データベースへの接続やSQLの発行を行うクラスです。
データベースを扱うLogicクラスのメソッドは、必ずDatabaseAccessクラスを引数に持ちます。
一見めんどくさい実装なのですが、これはデータベースのmaster・slaveを明確に使い分けるためです。
また、このクラスはトランザクション管理も受け持ちます。
insert・updateのSQLを発行する時、トランザクションが自動的に開始され、Actionクラスの終わりにコミットされます。
Output
Actionで作成された出力内容を整理して、実際に出力処理を行います。
ブラウザ向けのソーシャルゲームなら、テンプレートを読み込んでhtml出力をします。
また、ネイティブアプリなら、JSON出力を行います。
プラグイン的な設計にしているので、xmlでの出力などにも対応出来ます。
キャッシュ
運営中に値が変化しないテーブル(カードパラメータ等)は、APCにキャッシュしています。
キャッシュされているデータには有効期限のパラメータが仕込んであり、リクエスト毎にチェックして使用します。じゃないと、イベント期間が終わっているのにイベント用カードが出現している!というようなことになってしまいます。
Redis
ホーム画面などアクセスの多いリクエストでは、Redisにデータをキャッシュして、データベースの負荷軽減を行っています。
新人一覧や対戦相手一覧、などです。
また、Redisは他にソート済みセットでランキングの作成も行います。
Redisは速い!という評判ですが、過信するとえらいことになります。
そのあたりは、また別の記事で。
まとめ
このPHPのフレームワークは案件ごとに成長していて、今後も改修しながらさらに良くしていくつもりです。
ただ、今はPHP5.3までしか対応出来ていないので、5.4、5.5で新しく追加された機能を取り込んで行きたいとことです。generatorとか、finally句とか魅力的ですね。
あれやこれや改修したいとことがありますが、まだまだ手付かずです…