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なんて環境も作れたりしますよ。