メニュー

ソーシャルゲーム用のPHPフレームワーク

開発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句とか魅力的ですね。

あれやこれや改修したいとことがありますが、まだまだ手付かずです…

この記事をシェアする

  • twitter
  • facebook
  • Google+
  • B!はてブ
  • pocket
トップへ戻る

CONTACT

ゲーム開発、Webサイト制作に関するご相談等ございましたら、お気軽にお問い合わせください。

ゲーム開発に関する
お問い合わせはこちら

Webサイト制作に関する
お問い合わせはこちら