3

バージョン管理システムとしてGitを使用して、CakePHPでシステムを開発しています。テストサーバーと本番サーバーに作業用コピーがあり、どちらもデータベースが異なります。変更を加えるたびに、システムをテストできるようにデータベース構成を変更する必要があります。1つはテストサーバーに、もう1つは本番サーバーに、内容の異なる2つのファイルを保持する別の方法はありますか?ブランチは行くのに良い方法ですか?

4

3 に答える 3

4

あなたは枝でそれをしたくないでしょう。PHPと具体的に話すことはできませんが、2つのファイル(テスト構成と本番構成)を別々のブランチに保持するのではなく、それらを一緒に保持しますが、環境変数に、で使用するのに適切な構成を決定させます。ランタイム。

(これはRailsで行われる方法であり、うまく機能します。)

于 2009-06-12T13:30:03.783 に答える
1

私はかなり大雑把ですが効果的な手法を採用しました。私の開発環境には、「environment_development」という空のファイルがあります。私の実稼働環境には、「environment_PRODUCTION」という名前の環境があります(視覚的な強調を追加するための別のケース)。私のgitignoreファイルは、これらの両方を無視するように設定されています。

私のアプリケーションのフロントコントローラー(私はKohanaフレームワークを使用していますが、CakePHPにも同様のものがあると思います)は、これらのファイルの存在をチェックし、IN_PRODUCTION定数を適切に設定します。残りのコード(データベース構成、エラー処理など)は、この定数の値をチェックし、必要に応じて動作を変更できます。

以前は$_SERVER['SERVER_NAME']チェックを使用していましたが、この方法には次の利点があります。

  1. $ _SERVERが設定されていない場合、コマンドラインから実行するアプリの部分がある場合でも、たとえばcronjobsとして機能します。
  2. アプリが複数のドメインで実行されている場合でも機能します。
  3. それは完全に明白です。誰かがアプリの別の作業コピーをチェックアウトした場合、環境ファイルを作成するまで何も機能しないため、誰かが本番データベースに対して開発コードを実行する可能性はありません(またはほとんどありません)。
于 2009-06-12T14:18:12.730 に答える
0

データベースが環境に依存している場合は、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;
        }
    }
}
于 2009-06-12T13:55:06.797 に答える