it-swarm-ko.tech

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

기본적으로 항상 가장 큰 질문 중 하나는 개발/스테이징 워크 플로에서 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:[email protected]/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:[email protected]/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:[email protected]/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 파일에 많은 외부 코드가 있습니다 ... 더 나은 방법이 있습니까?

80
geerlingguy

내가하는 일은 해당 파일을 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에 유지할 수 있다는 것입니다.

66
Berdir

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

개인적으로 사이트의 모든 표준 테마와 모듈을 sites/all 그리고 sites/dev.example.comsites/example.com.

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

25
Paul Jones

파일을 로컬에서 무시하고 싶습니다 (.gitignore 파일을 git에 추가 한 다음 각 호스트에 파일이 있으면 별도의 버전을 유지하십시오.

10
ack

항상 DNS 또는 호스트 파일 항목을 설정하고 사용하는 경향이 있습니다.

dev.example.com
staging.example.com

example.com

그런 다음 다른 파일 디렉토리로 설정 파일 디렉토리를 완전히 분리했습니다. 예를 들어 ./sites/dev.example.com/files

6
Stewart Robinson

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

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

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

5
Kevin

데이터베이스 자격 증명 만 변경하는 경우 로컬 (및 준비/생산) 가상 호스트 구성 또는 웹 루트 위의 .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 파일을 추적하지 않아도됩니다.

2

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

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

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

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

STFU PHP 연산자 )라고도합니다.

0