Sugestie dotyczące ustawień.php - Lokalne oprogramowanie, serwer programistyczny, serwer na żywo

80

Zasadniczo jedno z największych pytań wszechczasów: w jaki sposób korzystasz z settings.php w procesie projektowania / przemieszczania?

W tej chwili mam skonfigurowany mój plik settings.php i opieram swój rozwój na dyrektywie $ HOST serwera - co oznacza, że ​​mogę pracować na dev.example.com dla serwera programistycznego (udostępnionego), local.example. com na moim komputerze lokalnym (i kasach lokalnych deweloperów) oraz www.example.com (lub po prostu example.com) na stronie na żywo.

(Ten kod znajduje się w sekcji „Ustawienia bazy danych” w pliku 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;

}
?>

Działa to całkiem dobrze do większości celów, ale oznacza to, że mamy dużo obcego kodu siedzącego w naszym wspólnym pliku settings.php ... czy jest lepszy sposób?

geerlingguy
źródło
Powinieneś użyć rozwiązania Drupal dla wielu witryn drupal.org/node/290768
sobi3ch

Odpowiedzi:

66

To, co robię, to rozdzielenie tego pliku na plik settings.php i plik local.settings.php.

Na końcu settings.php znajduje się następujący kod:

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

Plik lokalny jest następnie wykluczony z jakiegokolwiek używanego VCS. Zaletą jest to, że możesz umieszczać ustawienia, które są wspólne dla wszystkich instancji w pliku settings.php i mieć taką wersję / automatycznie dystrybuowaną oraz przechowywać lokalne rzeczy w pliku local.settings.php.

Berdir
źródło
2
Taką właśnie strategię stosuje się na samym drupal.org i konsekwentnie stosujemy ją w Palantir.net. W przypadku bikeshed zalecam użycie „settings.local.php” jako nazwy pliku, ponieważ odpowiada on wzorowi ustawionemu przez „settings.default.php”.
Dave Reid
1
Stworzyłem dla tego istotę: gist.github.com/1235389, ponieważ używam tego coraz częściej
chrisjlee
4
Uwaga: Drupal 8 domyślnie dodał teraz podobny fragment do pliku ustawień, wystarczy go odkomentować: drupal.org/node/1118520
Berdir
1
@DaveReid: wzorzec jest ustawiany przez „ default.settings.php ”, a nie przez „settings.default.php”.
iconoclast
1
W przypadku zabaw, których możesz użyć (__DIR__)zamiast dirname(__FILE__). Są równoważne .
cdmo
26

Wygląda na to, że wymyślasz na nowo wbudowaną funkcjonalność Drupala w wielu miejscach.

Osobiście przechowuję wszystkie standardowe motywy i moduły witryny sites/all, a następnie mam sites/dev.example.comi sites/example.com.

Jako dodatkowy bonus możesz mieć różne filesfoldery dla każdej strony, a także dodać dowolne moduły programistyczne sites/dev.example.com/modules.

Paul Jones
źródło
To ma sens, ale mam kilka witryn, w których jest już 5-10 folderów na wiele witryn, a posiadanie wszystkich motywów dla tych witryn w witrynach / wszystkich / motywach może być dość denerwujące. Nie wspominając o moim typowym użyciu custom.module dla każdej strony. Chyba mógłbym zamiast tego użyć sitename_custom.module: - /
geerlingguy
2
Zawsze możesz spróbować użyć dowiązań symbolicznych od sites/dev.example.com/modulesdosites/example.com/modules
Paul Jones
Akceptując tę ​​odpowiedź - wypróbuję to na stronie, nad którą aktualnie pracuję. Wygląda na dobre dopasowanie do mojego przepływu pracy.
geerlingguy
9
Myślę, że jest to w rzeczywistości kiepski sposób radzenia sobie ze środowiskami deweloperskimi i pośredniczącymi, ponieważ tak naprawdę nie są to różne / osobne witryny, a jedynie różne wersje tej samej witryny. W takim przypadku bardzo chciałbyś uniknąć posiadania osobnych plików dla każdej witryny. Bardzo polecam skorzystanie z metody wymienionej poniżej, w której wersja.php jest wersjonowana, a ustawienia specyficzne dla każdej witryny (ustawienia DB) są umieszczane w pliku local.settings.php, który nie jest wersjonowany.
Mikey P
1
@Mikey P - oba rozwiązania są prawidłowe - myślę, że w tym przypadku zależy to przede wszystkim od osobistych / zespołowych preferencji ... moim zdaniem istnieją kompromisy w obu przypadkach.
geerlingguy
10

Wolę zignorować plik lokalnie (używając .gitignorepliku w git), a następnie zachować osobne wersje, jeśli plik na każdym hoście.

ack
źródło
1
To interesujące rozwiązanie, chociaż lubię śledzenie ustawień. Php w git (niektóre błędy, które miałem, są spowodowane zmianami w ustawieniach. Php ...). Czy istnieje sposób, w jaki moja lokalna usługa git Checkout może zastąpić ten plik własnym plikiem (oprócz tego, że mam kopię we własnym pliku)?
geerlingguy
1
To też robię. Pliki z danymi konfiguracyjnymi, szczególnie z poświadczeniami bazy danych, nie mają miejsca w VCS.
mmartinov 03.03.11
@geerlingguy tak, możesz. Proszę przeczytać moją aktualizację (jeśli zostanie opublikowana;)
sobi3ch
@martin Zgadzam się, ale nie zapominajmy, że możemy mieć SPECJALNE oddzielne repozytorium tylko dla TEGO pliku! Możesz to przeczytać w mojej aktualizacji.
sobi3ch
7

Zazwyczaj zawsze konfiguruję wpisy DNS lub plików hosta i używam ich

dev.example.com
staging.example.com

i

example.com

Następnie mam całkowicie oddzielne katalogi plików ustawień z różnymi katalogami plików. Na przykład ./sites/dev.example.com/files

Stewart Robinson
źródło
Problem, który widzę w tym podejściu, polega na tym, że często mam katalog / themes / i / modules /, którego używam dla każdej witryny (często w konfiguracji wielostanowiskowej), a ponieważ muszę używać tych modułów i motywów specyficznych dla witryny dla lokalnych , deweloper i produkcja, nie mogę tak robić hostów /
wielu witryn
Słuszna uwaga. Wydaje mi się, że pominąłem linkowanie tych rzeczy.
Stewart Robinson
Możesz utworzyć dowiązanie symboliczne i w ten sposób udostępniać foldery motywów i modułów. Tak więc w zasadzie twój folder główny będzie folderem produkcyjnym, a następnie możesz z niego utworzyć dowiązania symboliczne do sceny, dewelopera i lokalnego.
gansbrest
5

Dlaczego nie mieć kilku folderów opartych na nazwie hosta programistycznego?

Przykład

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

Każdy z własnym plikiem ustawień i db_url.

Kevin
źródło
Potencjalny problem: Pliki zapisane / przesłane do jednego folderu witryny nie będą dostępne dla innego.
Greg
Zobacz moją odpowiedź na @Stewart :)
geerlingguy
Utwórz dowiązania symboliczne do centralnego folderu plików
Kevin
2

Jeśli jedyne rzeczy, które się zmieniają, to poświadczenia bazy danych, możesz ustawić zmienne środowiskowe w lokalnej (i tymczasowej / produkcyjnej) konfiguracji hosta wirtualnego lub w .htaccess folderze powyżej głównego katalogu głównego. Oto prosty przykład:

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

Następnie mogę utworzyć tutaj plik .htaccess:

/var/www/example.com/.htaccess

który ma następujący kod:

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

Następnie w /var/www/example.com/drupal-resides-here/sites/default/settings.php(lub cokolwiek) możesz pobrać poświadczenia bazy danych, takie jak:

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

Dzięki temu wielu programistów może uruchamiać rzeczy lokalnie, a Ty możesz przejść do etapu / produkcji przy jednoczesnym śledzeniu ustawień. Php (jest tam więcej rzeczy niż tylko poświadczenia bazy danych ...). Nie musisz również śledzić wielu plików settings.php.

Charlie Schliesser
źródło
Osobiście uważam, że to najlepsza droga. Jednak w naszym zestawie dodajemy instrukcje SetEnv do konfiguracji apache. Sprawia, że ​​jest trochę bardziej bezpieczny.
Scott Joudry,
To interesujące zastosowanie dla .htaccess i przechowywania zmiennych. A co z bieganiem drush up --y? Spowoduje to zastąpienie podstawowego pliku .htaccess.
Screenack
Odbywa się to w .htaccesspliku powyżej poziomu katalogu głównego. Na przykład /var/www/.htaccessprzechowuje te dyrektywy i /var/www/drupal/.htaccessnależałoby do Drupala .htaccess. Możesz też po prostu umieścić go w konfiguracji hosta wirtualnego Apache, co jest jeszcze przyjemniejsze. Niezależnie od tego, prawie zawsze mamy niestandardowe rzeczy w katalogu głównym, .htaccessdlatego jeśli zaktualizujemy Drupala, musimy porównać .htaccesszmiany z Gitem.
Charlie Schliesser
0

Najprostsze i najbardziej wydajne rozwiązanie składające się tylko z jednej linii jest następujące. Po prostu umieść go w ostatnim wierszu pliku settings.php:

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

Symbol @ z przodu oznacza po prostu nie wyświetlaj żadnego błędu, nawet jeśli nie znajdzie on tego pliku. Typowe ustawienia tego typu wymagają warunkowego sprawdzenia, czy plik tam jest. Osiąga to w jednym wierszu bez niego.

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

Znany również jako operator PHP STFU .

Patoshi パ ト シ
źródło
Proste, ale nie uważam za najbardziej wydajne. seanmonstar.com/post/909029460/…
AyeshK