settings.phpの提案-ローカル開発者、開発サーバー、ライブサーバー


80

基本的に、これまでで最も大きな質問の1つです。開発/ステージングワークフローでsettings.phpを使用する方法は何ですか?

現在、settings.phpファイルは次のように設定されており、サーバーの$ HOSTディレクティブに基づいて開発を行っています。つまり、開発(共有)サーバーlocal.exampleのdev.example.comで作業できます。ローカルコンピューター(および他の開発者のローカルコードチェックアウト)にはcom、ライブサイトにはwww.example.com(またはexample.com)を使用します。

(このコードはsettings.phpの「データベース設定」セクションにあります):

$host = $_SERVER['HTTP_HOST'];
$base_url = 'http://'.$host;
$cookie_domain = $host;

switch($host) {
  case 'example.com': # Production server
    $db_url = 'mysqli://prod_sql_user:password@127.0.0.1/prod_db';
    $update_free_access = FALSE;
    $conf = array (
      // Set production config options here...
      'example_setting' => 0,
    );
    break;

  case 'dev.example.com': # Development server
    $db_url = 'mysqli://dev_sql_user:password@127.0.0.1/dev_db';
    $update_free_access = FALSE;
    $conf = array (
      // Set production config options here...
      'example_setting' => 0,
    );
    break;

  case 'local.example.com': # Local server
    $db_url = 'mysqli://local_sql_user:password@127.0.0.1/local_db';
    $update_free_access = FALSE;
    $conf = array (
      // Set production config options here...
      'example_setting' => 0,
      // Turn off most core caching.
      'cache_inc' => 'includes/cache.inc',
      'cache' => CACHE_DISABLED,
    );
    break;

}
?>

これはほとんどの目的でかなりうまく機能しますが、共有settings.phpファイルに多くの無関係なコードが存在することを意味します...より良い方法はありますか?


Drupalマルチサイトソリューションdrupal.org/node/290768
sobi3ch

回答:


66

私がすることは、そのファイルをsettings.phpとlocal.settings.phpに分けることです。

settings.phpの最後に次のコードがあります。

if (file_exists(dirname(__FILE__) . '/local.settings.php')) {
  include dirname(__FILE__) . '/local.settings.php';
}

ローカルファイルは、使用しているVCSから除外されます。利点は、すべてのインスタンスに共通する設定をsettings.phpに配置し、そのバージョン設定/配布を自動的に行い、ローカルのものをlocal.settings.phpに保持できることです。


2
これは、実際にはdrupal.org自体で使用される戦略であり、Parantir.netで一貫して使用しています。自転車置き場では、「settings.default.php」で設定されたパターンと一致するため、「settings.local.php」をファイル名として使用することをお勧めします。
デイブリード

1
私はこのための要旨を作成しました:gist.github.com/1235389を 私はより頻繁に、このよりを使用してきたので、
chrisjleeを

4
注:Drupal 8では、デフォルトで同様のスニペットが設定ファイルに追加されました。コメントを外す
Berdir

1
@DaveReid:パターンは「settings.default.php」ではなく「default.settings.php」によって設定されます。
iconoclast

1
ファンシーには、の(__DIR__)代わりに使用できますdirname(__FILE__)それらは同等です。
cdmo

26

これは、Drupalの組み込みマルチサイト機能を再発明しているようです。

個人的には、サイトのすべての標準テーマとモジュールをに保持してからsites/all、とを持っsites/dev.example.comていsites/example.comます。

追加のボーナスとして、filesサイトごとに異なるフォルダーを作成し、開発モジュールを追加することもできsites/dev.example.com/modulesます。


それは理にかなっていますが、5〜10個のマルチサイトフォルダーが既にあるサイトがいくつかあり、sites / all / themesにそれらのサイトのすべてのテーマがあると非常に迷惑になります。各サイトでのcustom.moduleの典型的な使用は言うまでもありません。代わりにsitename_custom.moduleを使用できると思います:-/
geerlingguy

2
あなたはいつもからシンボリックリンクを使用して試みることができるsites/dev.example.com/modulesまでsites/example.com/modules
ポール・ジョーンズ

この回答を受け入れます-現在作業中のサイトでこれを試してみます。私のワークフローにぴったりのようです。
geerlingguy

9
これは実際には開発環境とステージング環境を処理する方法としては不十分だと思います。なぜなら、実際には異なる/別個のサイトではなく、同じサイトの異なるバージョンにすぎないからです。この場合、サイトごとに個別のファイルを作成することは避けたいでしょう。settings.phpがバージョン管理され、各サイトに固有の設定(DB設定)がバージョン管理されていないlocal.settings.phpに配置される場合、以下の方法を使用することを強くお勧めします。
マイキーP

1
@Mikey P-両方のソリューションは有効です。私はここで個人/チームの好み次第だと思います...私の意見では、どちらのアプローチにもトレードオフがあります。
geerlingguy

10

ローカルでファイルを無視し(.gitignoregitのファイルを使用)、各ホストにファイルがある場合は別々のバージョンを保持することを好みます。


1
これは興味深い解決策ですが、gitでsettings.phpを追跡するのが好きです(これまでに発生したバグの一部は、setting.phpの変更によるものです...)。ローカルのgit checkoutでそのファイルを自分のファイルに置き換えることができる方法はありますか(自分のファイルにコピーする以外に)?
geerlingguy

1
それも私がやっていることです。構成データ、特にデータベース資格情報を含むファイルは、VCS内に配置されません。
mmartinov

@geerlingguyはい、できます。アップデートを公開してください(公開される場合)
sobi3ch

@martin私は同意しますが、このファイルについてのみSPECIAL別のレポジトリを持つことができることを忘れないでください!あなたは私のアップデートでそれを読むことができます。
sobi3ch

7

私は常にDNSまたはホストファイルエントリを設定して使用する傾向があります

dev.example.com
staging.example.com

そして

example.com

次に、異なるファイルディレクトリを持つ完全に独立した設定ファイルディレクトリがあります。たとえば、。/ sites / dev.example.com / files


このアプローチで見られる問題は、各サイトに使用する/ themes /および/ modules /ディレクトリを頻繁に持っていることです(多くの場合、マルチサイトのセットアップで使用します)。 、開発、生産、私はちょうどそのようなホスト/マルチサイトを行うことはできません:-/
geerlingguy

いい視点ね。私は、私はその原料をシンボリックリンクすることを出て左に思います。
スチュワート・ロビンソン

シンボリックリンクを作成して、テーマとモジュールのフォルダーをそのように共有できます。したがって、基本的にはメインフォルダーがプロダクションフォルダーになり、そこからステージ、開発、ローカルへのシンボリックリンクを作成できます。
ガンスブレスト

5

開発ホスト名に基づいていくつかのフォルダーを作成しないのはなぜですか?

  • sites / dev1.domain.com
  • sites / dev2.domain.com
  • sites / dev3.domain.com
  • sites / www.domain.com

それぞれに独自の設定ファイルとdb_urlがあります。


潜在的な問題:あるサイトフォルダに保存/アップロードされたファイルは、別のサイトフォルダにはアクセスできません。
グレッグ

@Stewartへの私の返信を参照してください:)
geerlingguy

中央ファイルフォルダーへのシンボリックリンクを作成する
ケビン

2

データベース資格情報のみが変更される場合は、ローカル(およびステージング/本番)仮想ホスト構成またはWebルートの上の.htaccessフォルダーに環境変数を設定できます。以下に簡単な例を示します。

/var/www/example.com/drupal-resides-here

次に、ここで.htaccessファイルを作成できます。

/var/www/example.com/.htaccess

次のコードがあります:

SetEnv DB1_USER my_local_user
SetEnv DB1_PASS my_local_pass
SetEnv DB1_HOST my_local_host
SetEnv DB1_NAME my_local_dbname

次に/var/www/example.com/drupal-resides-here/sites/default/settings.php(または何でも)、次のようなdb資格情報を取得できます。

$db_url = "mysql://{$_SERVER['DB1_USER']}:{$_SERVER['DB1_PASS']}@{$_SERVER['DB1_HOST']}:{$_SERVER['DB1_PORT']}/{$_SERVER['DB1_NAME']}";

これにより、複数の開発者がローカルで物事を実行できるようになり、settings.phpを追跡しながらステージング/プロダクションにプッシュできます(データベースの資格情報以外にもあります...)。また、複数のsettings.phpファイルを追跡する必要もありません。


個人的にはこれが最善の方法だと思います。ただし、セットアップではSetEnvステートメントをapache configに追加します。それをもう少し安全にします。
スコットジュドリー

これは、.htaccessと変数ストレージの興味深い使用法です。しかし、実行するときはどうdrush up --yでしょうか?これにより、ベースの.htaccessファイルが上書きされます。
Screenack 14年

これは、.htaccesswebrootの上位レベルのファイルで行われます。たとえば、/var/www/.htaccessこれらのディレクティブを保存/var/www/drupal/.htaccessすると、Drupalになります.htaccess。また、Apache仮想ホスト構成に配置することもできますが、これはさらに優れています。それに関係なく、ほとんどの場合、webrootにはカスタムのものが.htaccessあります。したがって、Drupalを更新する場合は、.htaccess変更をGit と比較する必要があります。
チャーリー・シュリーサー14年

0

1行だけの最も簡単で効率的なソリューションは次のとおりです。settings.phpファイルの最後の行にそれを含めるだけです:

@include('settings.local.php');

先頭の@記号は、そのファイルが見つからなくてもエラーを表示しないことを意味します。このような一般的なセットアップには、ファイルが存在するかどうかを確認する条件が含まれます。これにより、それなしで1行で実行できます。

http://php.net/manual/en/language.operators.errorcontrol.php

STFU PHP演算子とも呼ばれます。


シンプルですが、最も効率的だとは思いません。seanmonstar.com/post/909029460/...
AyeshK
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.