Пропозиції щодо settings.php - Локальний розробник, сервер розвитку, сервер Live


80

В основному, одне з найважливіших питань усіх часів: якими способами ви користуєтеся settings.php для свого робочого процесу розвитку / постановки?

Зараз у мене налаштований файл settings.php, як описано нижче, і я базую свою розробку на директиві $ HOST сервера - це означає, що я можу працювати на dev.example.com для розробки (спільного) сервера, local.example. 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, і ми послідовно використовуємо на Palantir.net. Для отримання велосипеду я рекомендую використовувати "settings.local.php" як ім'я файлу, оскільки воно відповідає шаблону, встановленому "settings.default.php".
Дейв Рейд

1
Я створив для цього суть: gist.github.com/1235389, оскільки я використовую це все частіше та частіше
chrisjlee

4
Примітка: Drupal 8 тепер додав аналогічний фрагмент коду в файл настройок за замовчуванням, вам просто потрібно раскоментіровать: drupal.org/node/1118520
Berdir

1
@DaveReid: шаблон встановлюється " default.settings.php ", а не "settings.default.php".
іконоборство

1
Для ромашок ви можете використовувати (__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/modulesдоsites/example.com/modules
Пол Джонс

Приймаю цю відповідь - я спробую це на сайті, над яким я зараз працюю. Схоже, це добре підходить для мого робочого процесу.
geerlingguy

9
Я думаю, що це насправді поганий спосіб поводження з розробниками та інсценуванням середовищ, оскільки вони насправді не різні / окремі сайти, а лише різні версії одного сайту. У цьому випадку ви дуже хотіли б не мати окремих файлів для кожного сайту. Я б дуже рекомендував використовувати метод, згаданий нижче, де налаштовано параметри settings.php і параметри, характерні для кожного сайту (налаштування БД), розміщені в local.settings.php, який не є версією.
Mikey P

1
@Mikey P - обидва рішення справедливі - я думаю, що тут переважно залежить від особистих / командних переваг ... На мою думку, є компроміси з будь-яким підходом.
geerlingguy

10

Я вважаю за краще ігнорувати файл локально (використовуючи .gitignoreфайл у git), а потім зберігати окремі версії, якщо файл на кожному хості.


1
Це цікаве рішення, хоча мені подобається відстежувати settings.php в git (деякі помилки, які у мене з’являються, пов’язані із змінами setu.php ...). Чи є спосіб, щоб я мій локальний git checkout замінив цей файл на свій власний (окрім того, що я копіював у своєму власному файлі)?
geerlingguy

1
Це я теж роблю. Файли з конфігураційними даними, особливо з обліковими даними бази даних, не мають місця у VCS.
mmartinov

@geerlingguy так можна. Прочитайте, будь ласка, моє оновлення (якщо воно буде опубліковане;)
sobi3ch

@martin Я згоден, але не забуваймо, що ми можемо мати СПЕЦІАЛЬНЕ окреме репо лише для цього файлу! Ви можете прочитати його в моєму оновлення.
sobi3ch

7

Я прагну завжди налаштовувати записи DNS або файли хостів і використовувати

dev.example.com
staging.example.com

і

example.com

Тоді у мене є повністю окремі каталоги файлів налаштувань з різними каталогами файлів. Наприклад ./sites/dev.example.com/files


Проблема, яку я бачу при такому підході, полягає в тому, що у мене часто є / теми / та / модулі / каталог, який я використовую для кожного сайту (часто в налаштуваннях безлічі сайтів), і оскільки мені потрібно використовувати ці специфічні для сайту модулі та теми для локальних , розробник та виробництво, я не можу просто так робити хостинг /
мультисайт

Влучне зауваження. Я здогадуюсь, що я пропустив те, що я посилаю на цей матеріал.
Стюарт Робінсон

Ви можете створити симпосилання та поділитися папками тем та модулів таким чином. Таким чином, у вас головна папка буде виробничою папкою, а потім з неї ви зможете створити символьні посилання на етап та dev та local.
gansbrest

5

Чому б не було декількох папок на основі імені хоста розробки?

Приклад

  • сайти / dev1.domain.com
  • сайти / dev2.domain.com
  • сайти / dev3.domain.com
  • сайти / www.domain.com

Кожен із власним файлом налаштувань та db_url.


Потенційна проблема: Файли, збережені / завантажені в одну папку сайту, не будуть доступні іншій.
Грег

Дивіться мою відповідь на @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']}";

Це дозволяє декільком розробникам запускати речі локально, і ви можете перейти до інсценізації / виготовлення, відстежуючи налаштування.php (там є більше речей, ніж просто дані бази даних ...). Вам також не доведеться відслідковувати кілька файлів settings.php.


Я особисто думаю, що це найкращий шлях. Однак, під час налаштування ми додаємо оператори SetEnv у конфігурацію apache. Робить це трохи більш безпечним.
Скотт Джодрі

Це цікаве використання для .htaccess та змінного сховища. Але що робити, коли ти біжиш drush up --y? Це замінить ваш базовий .htaccess файл.
Screenack

Це робиться у .htaccessфайлі на рівні вище веб-кореня. Наприклад, /var/www/.htaccessзберігає ці директиви, і /var/www/drupal/.htaccessце буде Drupal .htaccess. Ви також можете просто помістити його в конфігурацію віртуального хоста Apache, що ще приємніше. Незалежно від будь-якого з цього, у нас майже завжди є спеціальні матеріали у веб-корі, .htaccessі тому, якщо ми оновлюємо Drupal, нам потрібно порівняти .htaccessзміни з Git.
Charlie Schliesser

0

Найпростішим та найефективнішим рішенням, що є лише одним рядком, є наступне. Просто включіть його в останній рядок файла settings.php:

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

Символ @ спереду просто означає, що не відображається жодна помилка, навіть якщо він не знайде цей файл. Типові налаштування на зразок цього передбачають умовну перевірку наявності файлу. Це виконує його в один рядок без нього.

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

Також відомий як оператор PHP STFU .


Просто, але я не вважаю найефективнішим. seanmonstar.com/post/909029460/…
АйешК
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.