CAKE_ENVで開発環境と本番環境の切り替え

久方ぶりにPHPerに戻ってる今日この頃。
RailsのRAILS_ENVで環境に応じた設定でアプリケーションが動作する、みたいなことをCakePHPでもやってみたのでメモ。

これで開発環境でも本番環境でも同じファイルが使えるようになり、リリースの都度手動又はデプロイツールで書き換えるとかそういうめんどくさいことしなくてもよくなる。

ちなみに以下のページを激しく参考にしました。感謝。

httpd.conf

まずCAKE_ENVというのをApacheのSERVER変数に持つ。
これがproductionなら本番環境。
セットされてなかったら開発環境扱いで。

<virtualhost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "/var/www/hoge_production"
    ServerName hoge.example.com
    ErrorLog "logs/hoge.production.error_log"
    CustomLog "logs/hoge.production.access_log" common
    SetEnv CAKE_ENV production
</virtualhost>
app/config/bootstrap.php

次にbootstrap.phpでCAKE_ENVにproductionを指定したときの動作とかを記述。
とりあえずデバッグメッセージがでないように。
もっと他にも環境別の項目を設定したい場合はswitch文とか使って書いたりした方がいいかもしれない。

<?php
/* SVN FILE: $Id$ */
Configure::write('debug', isset($_SERVER['CAKE_ENV']) && $_SERVER['CAKE_ENV'] == 'production' ? 0 : 2);
Configure::write('Security.salt', 'teketou ni kakikaeta salt');
Configure::write('Session.cookie', 'sid');
//EOF
?>
app/app_model.php

仕上げにデータベースの切り替えを定義。
まず環境ごとにデータベースを切り替えるためのハック。

<?php
class AppModel extends Model {
    function __construct($id = false, $table = null, $ds = null) {
        $this->useDbConfig = empty($_SERVER['CAKE_ENV']) ? 'default' : $_SERVER['CAKE_ENV'];
        parent::__construct($id, $table, $ds);
    }
}
?>

そしてdatabase.phpでpuroduction用のデータベースを定義

app/config/database.php
<?php
class DATABASE_CONFIG {

  /* 開発用のDB */
	var $default = array(
        'driver' => 'mysqli',
        'persistent' => false,
        'host' => 'localhost',
        'login' => 'dev',
        'password' => 'xxxxxxx',
        'database' => 'hogedb_dev',
        'prefix' => '',
        'port' => '/opt/local/var/run/mysql5/mysqld.sock', # MacPortsで入れたMySQL用の設定
	);

  /* 本番環境用のDB ApacheにCAKE_ENV=productionを定義 */
	var $production = array(
        'driver' => 'mysqli',
        'persistent' => false,
        'host' => 'db.example.com',
        'login' => 'dev',
        'password' => 'xxxxxxx',
        'database' => 'hogedb_prod',
        'prefix' => '',
	);

  /* SimpleTestによるテスト用のDB */
	var $test = array(
        'driver' => 'mysqli',
        'persistent' => false,
        'host' => 'localhost',
        'login' => 'dev',
        'password' => 'xxxxxxx',
        'database' => 'hogedb_test',
        'prefix' => '',
        'port' => '/opt/local/var/run/mysql5/mysqld.sock',
	);
}
?>

以上。
お望みならstagingなんて環境も作れたりしますよ。

次の記事

Hadoop本輪読会 第2回