端くれプログラマの備忘録 CakePHP [CakePHP] 環境に応じてデータベースの設定を変える

[CakePHP] 環境に応じてデータベースの設定を変える

ローカル、ステージング、本番など複数の環境があって、それぞれデータベースが異なる想定。環境に応じてデータベースの設定を変える方法を考える。

方法1: 設定ファイルを差し替える

環境ごとに設定ファイルを作っておいて、動作環境に応じて差し替える。例えば以下のファイルを作っておいて、ディプロイするときに動作環境に応じたファイルをDatabase.phpにリネームするわけだ。

  • Config/Database.local.php – ローカル用
  • Config/Database.staging.php – ステージング用
  • Config/Database.production.php – 本番用

この方法はわかりやすいが、ディプロイ作業が僅かに煩雑になる。例えば、リモートリポジトリにコードがまとめられている場合、単純にクローンするだけでは足りず、手動でDatabase.phpを仕度する必要がある。ディプロイ手順を工夫すれば済む話だけど。

方法2: プログラムで環境を判別して設定を動的に変える

現在の動作環境をプログラムで判別できるならば、データベース設定を動的に切り替える仕組みをDatabase.phpに組み込んでやればいい。例えば環境ごとにドメインが異なるなら以下のようにできる。

class DATABASE_CONFIG {

    public $default = array();

    // 本番用
    public $production = array(
        'datasource' => 'Database/Mysql',
        'persistent' => false,
        'host' => 'mysql.production.host',
        'login' => 'dbuser1',
        'password' => 'dbpass1',
        'database' => 'dbname1',
        'prefix' => '',
        'encoding' => 'utf8',
    );
    
    // ステージング用
    public $staging = array(
        'datasource' => 'Database/Mysql',
        'persistent' => false,
        'host' => 'mysql.staging.host',
        'login' => 'dbuser2',
        'password' => 'dbpass2',
        'database' => 'dbname2',
        'prefix' => '',
        'encoding' => 'utf8',
    );

    // ローカル用
    public $development = array(
        'datasource' => 'Database/Mysql',
        'persistent' => false, 
        'host' => 'localhost',
        'login' => 'dbuser3',
        'password' => 'dbpass3',
        'database' => 'dbname3',
        'prefix' => '',
        'encoding' => 'utf8',
    );
    
    public function __construct() {
        switch (env('HTTP_HOST')) {
            case 'localhost':
                $this->default = $this->development;
                break;
            case 'www.staging.host':
                $this->default = $this->staging;
                break;
            case 'www.production.host':
                $this->default = $this->production;
                break;
        }
    }
}

この方法の利点はディプロイが楽なこと。環境ごとに設定ファイルを用意する必要が無く、単純にディプロイするだけで動く。結果的に手間が減るしミスも減る。欠点らしい欠点はみつからないので、僕的には最近はこの方法を使うことが多い。