Settings.php için öneriler - Yerel geliştirme, Geliştirme sunucusu, Canlı sunucu


80

Temel olarak, tüm zamanların en büyük sorularından biri: Geliştirme / aşamalandırma iş akışınızda settings.php kullanmanın bazı yolları nelerdir?

Şu anda, settings.php dosyamı aşağıdaki gibi ayarlıyorum ve geliştirmemi sunucumun $ HOST yönergesine dayandırıyorum; yani, local.example (geliştirme) paylaşılan sunucusu için dev.example.com üzerinde çalışabilirim. yerel bilgisayarım için com (ve diğer aygıtın yerel kodları) ve canlı site için www.example.com (veya yalnızca example.com).

(Bu kod settings.php 'Veritabanı ayarları' bölümünde):

$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;

}
?>

Bu, çoğu amaç için oldukça iyi çalışıyor, ancak paylaşılan settings.php dosyamızda bir sürü yabancı kodun olduğu anlamına geliyor ... daha iyi bir yolu var mı?


Drupal çoklu site çözümünü kullanmalısınız drupal.org/node/290768
sobi3ch

Yanıtlar:


66

Yaptığım şey bu dosyayı bir settings.php ve bir local.settings.php dosyasına ayırmak.

Settings.php dosyasının sonunda şu kod bulunur:

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

Yerel dosya, kullandığınız VCS'den hariç tutulur. Bunun avantajı, settings.php içindeki tüm örneklerde ortak olan ayarları otomatik olarak yazdırabilmenizi / dağıtabilmenizi ve yerel öğeleri local.settings.php dosyasında saklayabilmenizdir.


2
Bu aslında drupal.org'da kullanılan strateji ve sürekli Palantir.net'te kullanıyoruz. Bir bisiklet için, 'settings.default.php' tarafından ayarlanan şablonla aynı olan dosya adı olarak 'settings.local.php' kullanmanızı öneririm.
Dave Reid

1
Bunun için bir fikir yarattım : gist.github.com/1235389 bunu daha sık kullanmaya başladığımdan beri
chrisjlee 22:11

4
Not: Drupal 8, varsayılan olarak ayarlar dosyasına benzer bir snippet ekledi, sadece onu açmanız gerekir: drupal.org/node/1118520
Berdir

1
@DaveReid: desen 'settings.default.php' tarafından değil ' default.settings.php ' ile ayarlanır .
iconoclast

1
(__DIR__)Bunun yerine kullanabileceğiniz eğlenceler için dirname(__FILE__). Onlar eşdeğerdir .
cdmo

26

Bu Drupal'ın multisite işlevselliğinde yerleşik olarak yeniden yarattığını gösteriyor.

Şahsen, site için tüm standart temaları ve modülleri içeride tutuyorum sites/allve sonra sahip sites/dev.example.comolduk sites/example.com.

Ek bir bonus olarak files, her site için farklı klasörlere sahip olabilir ve herhangi bir geliştirme modülünü de ekleyebilirsiniz sites/dev.example.com/modules.


Bu mantıklı geliyor, ama ben zaten 5-10 çok siteli klasörün olduğu birkaç sitem var ve bu siteler için tüm temaların sitelerde / all / temalarda olması oldukça can sıkıcı olabilir. Her site için custom.module kullanımımdan bahsetmiyorum bile. Bunun yerine sitename_custom.module
adresini

2
Her zaman gelen sembolik bağlantıları kullanarak deneyebilirsiniz sites/dev.example.com/modulesiçinsites/example.com/modules
Paul Jones

Bu cevabı kabul etmek - Bunu şu an üzerinde çalıştığım sitede deneyeceğim. İş akışıma uygun gibi görünüyor.
geerlingguy

9
Bence bu aslında dev ve evreleme ortamlarını ele almanın kötü bir yolu çünkü aslında farklı / ayrı siteler değil, aynı sitenin sadece farklı versiyonları değiller. Bu durumda, her site için ayrı dosyalar bulundurmaktan kaçınmak istersiniz. Settings.php'nin sürümlendirildiği ve her bir siteye özgü ayarların (DB ayarları) sürümlendirilmemiş bir local.settings.php içine yerleştirildiği, aşağıda belirtilen yöntemi kullanmanızı çok tavsiye ederim.
Mikey P

1
@Mikey P - her iki çözüm de geçerlidir - bence çoğunlukla kişisel / takım tercihine bağlı ... bence her iki yaklaşıma da hükmetme var.
geerlingguy

10

Dosyayı yerel olarak yoksaymayı ( .gitignoregit içindeki bir dosyayı kullanarak ) ve her bir ana bilgisayardaki dosya varsa ayrı sürümleri tutmayı tercih ederim .


1
Bu ilginç bir çözüm olsa da git settings.php 'nin izlemesini seviyorum (kırptığım bazı hatalar setting.php değişikliklerinden kaynaklanıyor ...). Yerel git kasamın bu dosyayı kendim ile değiştirmesini sağlayabilmemin bir yolu var mı (kendi dosyamda kopyalamam dışında)?
geerlingguy

1
Ben de öyle yapıyorum. VCS'de konfigürasyon verileri, özellikle veritabanı kimlik bilgileri olan dosyalar yer almaz.
mmartinov

@geerlingguy evet yapabilirsiniz. Lütfen güncellememi okuyun (eğer yayınlanacaksa;)
sobi3ch

@martin Katılıyorum, ama unutmayalım ki, yalnızca BU dosya için ÖZEL ayrı bir repo alabiliriz! Benim güncellememde okuyabilirsin.
sobi3ch

7

Her zaman DNS veya ana bilgisayar dosya girişlerini kurma ve kullanma eğilimindeyim

dev.example.com
staging.example.com

ve

example.com

Sonra tamamen farklı dosya dizinleri ile ayar dosya dizinleri tamamen ayrı var. Örneğin ./sites/dev.example.com/dosyalar


Bu yaklaşımla ilgili gördüğüm sorun, genellikle her site için (genellikle çok siteli bir kurulumda) kullandığım bir / temalar ve / / / modüller / dizine sahip olmam ve bu siteye özgü modülleri ve temaları yerel olarak kullanmam gerektiğinden , dev ve prodüksiyon, sadece ev sahibi /
multisite yapamam

İyi bir nokta. Sanırım bu şeyleri birbirine bağladığımdan vazgeçtim.
Stewart Robinson

Bir sembolik bağlantı oluşturabilir ve temaları ve modülleri klasörlerini bu şekilde paylaşabilirsiniz. Yani temelde siz ana klasör bir üretim klasörü olacak ve ondan sahne ve dev ve yerel için bir sembolik bağlantı oluşturabilirsiniz.
gansbrest

5

Geliştirme ana bilgisayar adını temel alan birkaç klasör neden olmasın?

Örnek

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

Her biri kendi ayar dosyası ve db_url.


Olası sorun: Bir site klasörüne kaydedilen / yüklenen dosyalara başkaları erişilemez.
Greg

@Stewart :) adlı
kişiye

Merkezi dosyalar klasörüne sembolik bağlantılar oluşturun
Kevin

2

Değişen tek şey veritabanı kimlik bilgileriyse, ortam değişkenlerini yerel (ve evreleme / üretim) sanal ana bilgisayar konfigürasyonunuzda veya .htaccess'te web kökünün üzerindeki bir klasörde ayarlayabilirsiniz. İşte basit bir örnek:

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

Daha sonra burada bir .htaccess dosyası oluşturabilirim:

/var/www/example.com/.htaccess

aşağıdaki kodu vardır:

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

Sonra /var/www/example.com/drupal-resides-here/sites/default/settings.php(ya da her neyse) db gibi kimlik bilgilerini alabilirsin:

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

Bu, birden fazla geliştiricinin yerel olarak işleri yönetmesine olanak tanır ve hala settings.php'yi izlerken aşamalandırma / prodüksiyona gidebilirsiniz (orada yalnızca veritabanı kimlik bilgilerinden daha fazla şey var ...). Ayrıca birden fazla settings.php dosyasını takip etmeniz gerekmez.


Ben şahsen bunun en iyi yol olduğunu düşünüyorum. Ancak, kurulumumuzda SetEnv ifadelerini apache config'e ekliyoruz. Biraz daha güvenli hale getirir.
Scott Joudry,

Bu .htaccess ve değişken depolama için ilginç bir kullanımdır. Peki ya kaçtığında drush up --y? Temel .htaccess dosyanızın üzerine yazacaktır.
Screenack

Bu, .htaccesswebroot'un üstündeki bir dosyada yapılır . Örneğin, /var/www/.htaccessbu direktifleri saklar ve /var/www/drupal/.htaccessDrupal'a ait olur .htaccess. Ayrıca sadece Apache'nin sanal ana bilgisayar yapılandırmasına koyabilirsiniz, ki bu daha da hoş. Bunlardan herhangi biri ne olursa olsun, webroot'larda hemen hemen her zaman özel şeyler vardır .htaccessve bu nedenle Drupal'ı güncellersek, .htaccessdeğişiklikleri Git ile karşılaştırmamız gerekir .
Charlie Schliesser

0

Sadece bir satır olan en basit ve en verimli çözüm aşağıdaki gibidir. Sadece settings.php dosyanızın son satırına ekleyin:

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

Ön kısımdaki @ sembolü, yalnızca bu dosyayı bulamamasına rağmen herhangi bir hata göstermediği anlamına gelir. Tipik kurulum bunun gibidir, dosyanın orada olup olmadığını kontrol etmek için bir koşulludur. Bu, onsuz bir çizgide gerçekleştirir.

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

STFU PHP operatörü olarak da bilinir .


Basit, ama en verimli olduğunu sanmıyorum. seanmonstar.com/post/909029460/…
AyeshK
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.