バージョン管理システムとしてGitを使用して、CakePHPでシステムを開発しています。テストサーバーと本番サーバーに作業用コピーがあり、どちらもデータベースが異なります。変更を加えるたびに、システムをテストできるようにデータベース構成を変更する必要があります。1つはテストサーバーに、もう1つは本番サーバーに、内容の異なる2つのファイルを保持する別の方法はありますか?ブランチは行くのに良い方法ですか?
3 に答える
あなたは枝でそれをしたくないでしょう。PHPと具体的に話すことはできませんが、2つのファイル(テスト構成と本番構成)を別々のブランチに保持するのではなく、それらを一緒に保持しますが、環境変数に、で使用するのに適切な構成を決定させます。ランタイム。
(これはRailsで行われる方法であり、うまく機能します。)
私はかなり大雑把ですが効果的な手法を採用しました。私の開発環境には、「environment_development」という空のファイルがあります。私の実稼働環境には、「environment_PRODUCTION」という名前の環境があります(視覚的な強調を追加するための別のケース)。私のgitignoreファイルは、これらの両方を無視するように設定されています。
私のアプリケーションのフロントコントローラー(私はKohanaフレームワークを使用していますが、CakePHPにも同様のものがあると思います)は、これらのファイルの存在をチェックし、IN_PRODUCTION定数を適切に設定します。残りのコード(データベース構成、エラー処理など)は、この定数の値をチェックし、必要に応じて動作を変更できます。
以前は$_SERVER['SERVER_NAME']チェックを使用していましたが、この方法には次の利点があります。
- $ _SERVERが設定されていない場合、コマンドラインから実行するアプリの部分がある場合でも、たとえばcronjobsとして機能します。
- アプリが複数のドメインで実行されている場合でも機能します。
- それは完全に明白です。誰かがアプリの別の作業コピーをチェックアウトした場合、環境ファイルを作成するまで何も機能しないため、誰かが本番データベースに対して開発コードを実行する可能性はありません(またはほとんどありません)。
データベースが環境に依存している場合は、database.php
ファイルで次のようにすることができます。
class DATABASE_CONFIG {
var $default = NULL;
var $prod = array(
'driver' => 'mysql',
'persistent' => false,
'host' => 'localhost',
'login' => 'username',
'password' => 'password',
'database' => 'productionDatabaseName',
'prefix' => '',
);
var $staging = array(
'driver' => 'mysql',
'persistent' => false,
'host' => 'localhost',
'login' => 'username',
'password' => 'password',
'database' => 'stagingDatabaseName',
'prefix' => '',
);
//var $dev = ...
// Chooses production or staging depending on URL
function __construct ()
{
if(isset($_SERVER['SERVER_NAME']))
{
switch($_SERVER['SERVER_NAME'])
{
case 'myhostname.com':
case 'www.myhostname.com':
$this->default = $this->prod;
break;
case 'staging.myhostname.com':
$this->default = $this->staging;
break;
default:
$this->default = $this->dev;
}
}
else // Use local for any other purpose
{
$this->default = $this->dev;
}
}
}