settings.php에 대한 제안-로컬 개발자, 개발 서버, 라이브 서버


80

기본적으로 항상 가장 큰 질문 중 하나는 개발 / 스테이징 워크 플로에서 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.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 자체에 사용 된 전략이며 Palantir.net에서 일관되게 사용합니다. 자전거 타기의 경우 'settings.default.php'에서 설정 한 패턴과 일치하므로 파일 이름으로 'settings.local.php'를 사용하는 것이 좋습니다.
Dave Reid

1
나는 이것에 대한 요점을 만들었습니다 : gist.github.com/1235389 더 자주 사용하고 있기 때문에
chrisjlee

4
참고 : Drupal 8은 기본적으로 설정 파일에 유사한 스 니펫을 추가 했으므로
Berdir

1
@DaveReid : 패턴은 'settings.default.php'가 아니라 ' default.settings.php '로 설정됩니다.
iconoclast

1
funsies 들어 (__DIR__)대신 사용할 수 있습니다 dirname(__FILE__). 그것들은 동등하다 .
cdmo

26

이것은 Drupal의 내장 멀티 사이트 기능을 재창조 한 것 같습니다.

개인적으로 사이트에 대한 모든 표준 테마와 모듈을에 보관 sites/all한 다음 및를 보유 sites/dev.example.com하고 sites/example.com있습니다.

추가 보너스 files로 각 사이트마다 다른 폴더를 가질 수 있으며 개발 모듈도 추가 할 수 있습니다 sites/dev.example.com/modules.


그것은 의미가 있지만 5-10 개의 멀티 사이트 폴더가 이미있는 사이트가 몇 개 있습니다. 사이트 / 모든 / 테마에 해당 사이트의 모든 테마가 상당히 성 가실 수 있습니다. 각 사이트에 대한 custom.module의 일반적인 사용은 말할 것도 없습니다. 대신 sitename_custom.module을 사용할 수 있다고 생각합니다 :-/
geerlingguy

2
당신은 항상에서 심볼릭 링크를 사용하여 시도해 볼 수도 sites/dev.example.com/modulessites/example.com/modules
폴 존스

이 답변을 수락-나는 현재 작업중 인 사이트에서 이것을 시도 할 것입니다. 내 워크 플로에 적합한 것 같습니다.
geerlingguy

9
필자는 이것이 실제로 다른 사이트와 별도의 사이트가 아니라 동일한 사이트의 다른 버전이기 때문에 개발 및 준비 환경을 처리하는 데 나쁜 방법이라고 생각합니다. 이 경우 각 사이트마다 별도의 파일을 사용하지 않는 것이 좋습니다. settings.php의 버전이 지정되고 각 사이트에 대한 설정 (DB 설정)이 버전이 지정되지 않은 local.settings.php에 배치되는 아래 언급 된 방법을 사용하는 것이 좋습니다.
Mikey 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

좋은 지적. 나는 그 것들을
Stewart Robinson

심볼릭 링크를 만들고 그런 방식으로 테마 및 모듈 폴더를 공유 할 수 있습니다. 따라서 기본적으로 기본 폴더는 프로덕션 폴더가되고이 폴더에서 준비 및 개발 및 로컬에 대한 심볼릭 링크를 만들 수 있습니다.
gansbrest

5

개발 호스트 이름을 기반으로 몇 개의 폴더가없는 이유는 무엇입니까?

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

각각 자체 설정 파일과 db_url이 있습니다.


잠재적 인 문제 : 한 사이트 폴더에 저장 / 업로드 된 파일은 다른 사이트 폴더에 액세스 할 수 없습니다.
Greg

@Stewart에 대한 내 답변보기 :)
geerlingguy

중앙 파일 폴더에 대한 심볼릭 링크 만들기
Kevin

2

데이터베이스 자격 증명 만 변경하는 경우 로컬 (및 준비 / 생산) 가상 호스트 구성 또는 웹 루트 위의 .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 구성에 추가합니다. 좀 더 안전하게 만듭니다.
Scott Joudry

.htaccess와 가변 저장소에 흥미로운 용도입니다. 하지만 달리면 drush up --y어떨까요? 기본 .htaccess 파일을 덮어 씁니다.
Screenack

이것은 .htaccesswebroot보다 높은 수준 의 파일 에서 수행됩니다 . 예를 들어, /var/www/.htaccess이러한 지시문을 저장 /var/www/drupal/.htaccess하며 Drupal 's가 .htaccess됩니다. Apache 가상 호스트 구성에 넣을 수도 있습니다. 그 중 하나에 관계없이 거의 항상 웹 루트에 사용자 정의 항목이 .htaccess있으므로 Drupal을 업데이트하면 .htaccess변경 사항을 Git과 비교해야합니다 .
Charlie Schliesser

0

한 줄에 불과한 가장 단순하고 효율적인 솔루션은 다음과 같습니다. settings.php 파일의 마지막 줄에 포함하십시오.

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

앞의 @ 기호는 해당 파일을 찾지 못해도 오류가 표시되지 않음을 의미합니다. 이와 같은 일반적인 설정에는 파일이 있는지 확인하기위한 조건이 포함됩니다. 이것은 그것없이 한 줄로 달성합니다.

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.