Gợi ý cho settings.php - Nhà phát triển cục bộ, Máy chủ phát triển, Máy chủ trực tiếp


80

Về cơ bản, một trong những câu hỏi lớn nhất mọi thời đại: một số cách bạn đang sử dụng settings.php trong quy trình phát triển / dàn dựng của bạn là gì?

Ngay bây giờ, tôi có tệp settings.php được thiết lập như sau và tôi dựa vào sự phát triển của mình trên chỉ thị $ HOST của máy chủ nghĩa là tôi có thể làm việc trên dev.example.com cho máy chủ phát triển (chia sẻ), local.example. com cho máy tính cục bộ của tôi (và kiểm tra mã địa phương của nhà phát triển khác) và www.example.com (hoặc chỉ example.com) cho trang web trực tiếp.

(Mã này nằm trong phần 'Cài đặt cơ sở dữ liệu' của 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;

}
?>

Điều này hoạt động khá tốt cho hầu hết các mục đích, nhưng điều đó có nghĩa là chúng ta có rất nhiều mã ngoại lai ngồi xung quanh trong tệp settings.php được chia sẻ của chúng ta ... có cách nào tốt hơn không?


Bạn nên sử dụng giải pháp đa trang web Drupal drupal.org/node/290768
sobi3ch

Câu trả lời:


66

Những gì tôi làm là tách tệp đó thành settings.php và local.sinstall.php.

Ở phần cuối của tệp.php là đoạn mã sau:

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

Sau đó, tệp cục bộ được loại trừ khỏi mọi VCS bạn đang sử dụng. Ưu điểm là bạn có thể đặt các cài đặt phổ biến trên tất cả các phiên bản trong settings.php và có phiên bản / phân phối đó tự động và giữ các nội dung cục bộ trong local.sinstall.php.


2
Đây thực sự là chiến lược được sử dụng trên chính drupal.org và chúng tôi sử dụng nhất quán tại Palantir.net. Đối với người đi xe đạp, tôi khuyên bạn nên sử dụng 'settings.local.php' làm tên tệp vì nó khớp với mẫu được đặt bởi 'settings.default.php'.
Dave Reid

1
Tôi đã tạo ra một ý chính cho việc này: gist.github.com/1235389 vì tôi đã sử dụng nó ngày càng thường xuyên hơn
chrisjlee

4
Lưu ý: Theo mặc định, Drupal 8 đã thêm một đoạn mã tương tự vào tệp cài đặt, bạn chỉ cần bỏ ghi chú: drupal.org/node/1118520
Berdir

1
@DaveReid: mẫu được đặt bởi ' default.sinstall.php ' chứ không phải bởi 'settings.default.php'.
iconoclast

1
Đối với những niềm vui bạn có thể sử dụng (__DIR__)thay vì dirname(__FILE__). Chúng tương đương nhau .
cdmo

26

Điều này có vẻ như bạn đang phát minh lại chức năng đa trang của Drupal.

Cá nhân, tôi giữ tất cả các chủ đề và mô-đun chuẩn cho trang web sites/all, sau đó có sites/dev.example.comsites/example.com .

Là một phần thưởng bổ sung, sau đó bạn có thể có các filesthư mục khác nhau cho mỗi trang web và bạn cũng có thể thêm bất kỳ mô-đun phát triển nào sites/dev.example.com/modules.


Điều đó có ý nghĩa gì đó, nhưng tôi có một vài trang web đã có 5-10 thư mục đa trang và có tất cả các chủ đề cho các trang web đó trong các trang web / tất cả / chủ đề có thể khá khó chịu. Không đề cập đến việc sử dụng custom.module điển hình của tôi cho mỗi trang web. Tôi đoán rằng tôi có thể sử dụng sitename_custom.module thay vào đó: - /
ge Muffguy

2
Bạn luôn có thể thử sử dụng các liên kết tượng trưng từ sites/dev.example.com/modulesđếnsites/example.com/modules
Paul Jones

Chấp nhận câu trả lời này - Tôi sẽ thử nó trên trang web tôi hiện đang làm việc. Có vẻ như phù hợp với quy trình làm việc của tôi.
ge Muffguy

9
Tôi nghĩ rằng đây thực sự là một cách kém để xử lý các môi trường phát triển và phân tầng vì chúng không thực sự khác biệt / các trang web riêng biệt, chỉ là các phiên bản khác nhau của cùng một trang web. Trong trường hợp này, bạn rất muốn tránh có các tệp riêng biệt cho mỗi trang web. Tôi rất khuyến nghị sử dụng phương thức được đề cập bên dưới nơi cài đặt.php được đặt phiên bản và cài đặt cụ thể cho từng trang web (cài đặt DB) được đặt trong local.sinstall.php không được phiên bản.
Mikey P

1
@Mikey P - cả hai giải pháp đều hợp lệ. Tôi nghĩ rằng phần lớn tùy thuộc vào sở thích cá nhân / nhóm ở đây ... có sự đánh đổi với một trong hai cách tiếp cận, theo ý kiến ​​của tôi.
ge Muffguy

10

Tôi thích bỏ qua tệp cục bộ (sử dụng .gitignoretệp trong git) và sau đó giữ các phiên bản riêng biệt nếu tệp trên mỗi máy chủ.


1
Đây là một giải pháp thú vị, mặc dù tôi rất thích theo dõi settings.php trong git (một số lỗi tôi đã phát triển là do thay đổi cài đặt.php ...). Có cách nào để tôi có thể yêu cầu kiểm tra git cục bộ thay thế tệp đó bằng tệp của riêng tôi (ngoài việc tôi sao chép trong tệp của riêng tôi) không?
ge Muffguy

1
Đó cũng là những gì tôi làm. Các tệp có dữ liệu cấu hình, đặc biệt là với thông tin cơ sở dữ liệu không có chỗ trong VCS.
mmartinov

@ge Muffguy vâng bạn có thể. Vui lòng đọc cập nhật của tôi (nếu nó sẽ được xuất bản;)
sobi3ch

@martin Tôi đồng ý, nhưng đừng quên chúng ta chỉ có thể có repo riêng ĐẶC BIỆT cho tệp NÀY! Bạn có thể đọc nó trong bản cập nhật của tôi.
sobi3ch

7

Tôi có xu hướng luôn thiết lập DNS hoặc lưu trữ các mục nhập tệp và sử dụng

dev.example.com
staging.example.com

example.com

Sau đó, tôi có các thư mục cài đặt tập tin hoàn toàn riêng biệt với các thư mục tập tin khác nhau. Chẳng hạn ./sites/dev.example.com/files


Vấn đề tôi gặp phải với cách tiếp cận đó là tôi thường có một thư mục / Themes / và / mô-đun / mà tôi sử dụng cho mỗi trang web (thường trong một thiết lập nhiều trang) và vì tôi cần sử dụng các mô-đun và chủ đề dành riêng cho trang web đó cho cục bộ , nhà phát triển và sản xuất, tôi không thể chỉ làm máy chủ / nhiều trang như thế: - /
ge Muffguy

Điểm tốt. Tôi đoán tôi đã bỏ qua rằng tôi liên kết nội dung đó.
Stewart Robinson

Bạn có thể tạo một liên kết tượng trưng và chia sẻ các thư mục chủ đề và mô-đun theo cách đó. Vì vậy, về cơ bản, thư mục chính của bạn sẽ là một thư mục sản xuất và sau đó từ đó bạn có thể tạo một liên kết tượng trưng đến giai đoạn và dev và cục bộ.
gansbrest

5

Tại sao không có một vài thư mục dựa trên tên máy chủ phát triển?

Thí dụ

  • trang web / dev1.domain.com
  • trang web / dev2.domain.com
  • trang web / dev3.domain.com
  • trang web / www.domain.com

Mỗi tệp có tệp cài đặt riêng và db_url.


Vấn đề tiềm ẩn: Các tệp được lưu / tải lên trong một thư mục trang web sẽ không thể truy cập được vào một thư mục khác.
Greg

Xem câu trả lời của tôi cho @Stewart :)
ge Muffguy

Tạo liên kết tượng trưng đến thư mục tệp trung tâm
Kevin

2

Nếu điều duy nhất thay đổi là thông tin xác thực cơ sở dữ liệu, thì bạn có thể đặt các biến môi trường trong cấu hình máy chủ ảo cục bộ (và dàn / sản xuất) hoặc trong .htaccess một thư mục phía trên thư mục gốc của bạn. Đây là một ví dụ đơn giản:

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

Sau đó tôi có thể tạo tệp .htaccess tại đây:

/var/www/example.com/.htaccess

có mã sau:

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

Sau đó, trong /var/www/example.com/drupal-resides-here/sites/default/settings.php(hoặc bất cứ điều gì), bạn có thể lấy thông tin đăng nhập db như:

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

Điều này cho phép nhiều nhà phát triển chạy mọi thứ cục bộ và bạn có thể chuyển sang dàn / sản xuất trong khi vẫn theo dõi settings.php (có nhiều thứ trong đó hơn là thông tin xác thực cơ sở dữ liệu ...). Bạn cũng sẽ không phải theo dõi nhiều tệp settings.php.


Cá nhân tôi nghĩ rằng đây là cách tốt nhất để đi. Tuy nhiên, thiết lập của chúng tôi, chúng tôi thêm các câu lệnh SetEnv vào cấu hình apache. Làm cho nó an toàn hơn một chút.
Scott Joudry

Đó là một cách sử dụng thú vị cho .htaccess và lưu trữ biến. Nhưng những gì về khi bạn chạy drush up --y? Điều đó sẽ ghi đè lên tập tin .htaccess cơ sở của bạn.
Màn hình

Điều này được thực hiện trong một .htaccesstập tin ở mức trên webroot. Ví dụ: /var/www/.htaccesslưu trữ các chỉ thị này và /var/www/drupal/.htaccesssẽ là của Drupal .htaccess. Bạn cũng có thể đặt nó trong cấu hình máy chủ ảo Apache, thậm chí còn đẹp hơn. Bất kể điều đó là gì, chúng tôi hầu như luôn có các công cụ tùy chỉnh trong webroot .htaccessvà do đó, nếu chúng tôi cập nhật Drupal, chúng tôi cần so sánh các .htaccessthay đổi với Git.
Charlie Schliesser

0

Giải pháp đơn giản và hiệu quả nhất chỉ là một dòng là như sau. Chỉ cần đưa nó vào dòng cuối cùng của tệp settings.php của bạn:

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

Biểu tượng @ ở phía trước chỉ có nghĩa là không hiển thị bất kỳ lỗi nào ngay cả khi nó không tìm thấy tệp đó. Thiết lập điển hình như thế này liên quan đến một điều kiện để kiểm tra xem tập tin có ở đó không. Điều này thực hiện nó trong một dòng mà không có nó.

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

Còn được gọi là toán tử STFU PHP .


Đơn giản, nhưng tôi không nghĩ là hiệu quả nhất. seanmonstar.com/post/909029460/ Lời
AyeshK
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.