Settings.php के सुझाव - स्थानीय देव, विकास सर्वर, लाइव सर्वर


80

मूल रूप से, अब तक के सबसे बड़े सवालों में से एक: आप अपने विकास / स्टेजिंग वर्कफ़्लो में settings.php का उपयोग करने के कुछ तरीके क्या हैं?

अभी, मेरे पास मेरी सेटिंग है। पीपीपी फ़ाइल निम्न की तरह सेट है, और मैं सर्वर के $ HOST निर्देश पर अपने विकास को आधार बनाता हूं - जिसका अर्थ है कि मैं dev.example.com पर विकास (साझा) सर्वर, local.example के लिए काम कर सकता हूं। मेरे स्थानीय कंप्यूटर के लिए कॉम (और अन्य देव के स्थानीय कोड चेकआउट), और लाइव साइट के लिए www.example.com (या सिर्फ example.com)।

(यह कोड सेटिंग्स के 'डेटाबेस सेटिंग्स' अनुभाग में है। पीएचपी):

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

}
?>

यह अधिकांश उद्देश्यों के लिए बहुत अच्छी तरह से काम करता है, लेकिन इसका मतलब है कि हमारे पास हमारी साझा सेटिंग्स में बहुत सारे एक्सट्रॉनिक कोड बैठे हैं। फ़ाइल में ... क्या कोई बेहतर तरीका है?


आपको Drupal multi-site solution drupal.org/node/290768
sobi3ch

जवाबों:


66

मैं जो करता हूं, उस फाइल को सेटिंग में अलग कर रहा हूं।

Settings.php के अंत में निम्नलिखित कोड है:

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

स्थानीय फ़ाइल को तब आप जो भी VCS उपयोग कर रहे हैं, से बाहर रखा गया है। फायदा यह है कि आप सेटिंग्स को सेट कर सकते हैं जो सेटिंग्स में सभी उदाहरणों में सामान्य हैं। पीपीपी और जो स्वचालित रूप से वितरित / वितरित किए गए हैं और स्थानीय सामान को स्थानीय में भेजते हैं।


2
यह वास्तव में drupal.org पर उपयोग की जाने वाली रणनीति है और हम Palantir.net पर लगातार उपयोग करते हैं। एक बिकेशेड के लिए, मैं फ़ाइल नाम के रूप में 'settings.local.php' का उपयोग करने की सलाह देता हूं क्योंकि यह 'settings.default.php' द्वारा निर्धारित पैटर्न से मेल खाता है।
डेव रीड

1
मैंने इसके लिए एक जिस्ट बनाया है: gist.github.com/1235389 जब से मैं इसे अधिक से अधिक बार उपयोग कर रहा
हूं

4
नोट: Drupal 8 ने अब डिफ़ॉल्ट रूप से सेटिंग फ़ाइल में एक समान स्निपेट जोड़ दिया है, आपको बस इसे
अनसुना

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
Paul Jones

इस उत्तर को स्वीकार करते हुए - मैं उस साइट पर यह कोशिश करने जा रहा हूं जो मैं वर्तमान में काम कर रहा हूं। मेरे वर्कफ़्लो के लिए एक अच्छा फिट लगता है।
जेरलिंगगुगी

9
मुझे लगता है कि यह वास्तव में देव और मंचन के वातावरण को संभालने का एक खराब तरीका है क्योंकि वे वास्तव में अलग / अलग साइट नहीं हैं, एक ही साइट के विभिन्न संस्करण। इस स्थिति में आप प्रत्येक साइट के लिए अलग-अलग फ़ाइल रखने से बचना चाहते हैं। मैं नीचे बताई गई विधि का उपयोग करने की बहुत अनुशंसा करता हूं, जहां settings.php को संस्करणित किया गया है और प्रत्येक साइट (DB सेटिंग्स) के लिए विशिष्ट सेटिंग्स को local.settings.php में डाला गया है जो संस्करणबद्ध नहीं है।
मिकी पी

1
@ माईकी पी - दोनों समाधान मान्य हैं - मुझे लगता है कि यह ज्यादातर व्यक्तिगत / टीम वरीयता के लिए है ... मेरे विचार से या तो दृष्टिकोण के साथ ट्रेडऑफ़ हैं।
geerlingguy

10

मैं फ़ाइल को स्थानीय रूप से अनदेखा करना पसंद करता हूं ( .gitignoreफ़ाइल में फ़ाइल का उपयोग करके ) और फिर प्रत्येक होस्ट पर फ़ाइल होने पर अलग संस्करण रखें।


1
यह एक दिलचस्प समाधान है, हालांकि मैं git में settings.php को ट्रैक करना पसंद करता हूं (कुछ बग्स जो मैंने क्रॉप किए हैं वे सेटिंग .php परिवर्तन के कारण हैं ...)। क्या कोई ऐसा तरीका है जिससे मैं अपने स्थानीय git चेकआउट को उस फ़ाइल को अपने साथ बदल सकता हूं (इसके अलावा मेरी खुद की फ़ाइल में प्रतिलिपि होने के बाद)?
geerlingguy

1
यही मैं भी करता हूं। कॉन्फ़िगरेशन डेटा के साथ फ़ाइलें, विशेष रूप से डेटाबेस क्रेडेंशियल्स के साथ VCS में कोई स्थान नहीं है।
एममार्टिनोव

@geerlingguy हाँ आप कर सकते हैं। कृपया मेरा अपडेट पढ़ें (यदि यह प्रकाशित किया जाएगा;)
sobi3ch

@ स्मार्टिन मैं सहमत हूँ, लेकिन यह मत भूलो कि हमारे पास विशेष अलग रेपो केवल इस फ़ाइल के लिए हो सकते हैं! आप इसे मेरे अपडेट में पढ़ सकते हैं।
sobi3ch

7

मैं हमेशा DNS या होस्ट फ़ाइल प्रविष्टियों को सेट करता हूं और उपयोग करता हूं

dev.example.com
staging.example.com

तथा

example.com

तब मैं अलग फाइल निर्देशिका के साथ पूरी तरह से अलग सेटिंग्स फ़ाइल निर्देशिका है। उदाहरण के लिए ।/sites/dev.example.com/files


उस समस्या को मैं उस दृष्टिकोण के साथ देखता हूं कि मेरे पास अक्सर एक / थीम / और / मॉड्यूल / निर्देशिका होती है जिसका उपयोग मैं प्रत्येक साइट के लिए करता हूं (अक्सर एक मल्टीसाइट सेटअप में), और चूंकि मुझे स्थानीय के लिए उन साइट-विशिष्ट मॉड्यूल और थीम का उपयोग करने की आवश्यकता होती है , देव और उत्पादन, मैं सिर्फ होस्ट /
मल्टीसाइट

अच्छी बात। मुझे लगता है मैं छोड़ दिया है कि मैं उस सामान में सहानुभूति रखता हूं।
स्टीवर्ट रॉबिन्सन

आप इस तरह से एक सिमलिंक बना सकते हैं और थीम और मॉड्यूल फ़ोल्डर साझा कर सकते हैं। तो मूल रूप से आप मुख्य फ़ोल्डर एक प्रोडक्शन फोल्डर होंगे और फिर उसमें से आप स्टेज और देव और स्थानीय के लिए एक सिमिलिंक बना सकते हैं।
गैंसब्रस्ट

5

विकास होस्ट नाम के आधार पर कुछ फ़ोल्डर क्यों नहीं हैं?

उदाहरण

  • साइटों / dev1.domain.com
  • साइटों / dev2.domain.com
  • साइटों / dev3.domain.com
  • साइटों / www.domain.com

प्रत्येक अपनी सेटिंग्स फ़ाइल और db_url के साथ।


संभावित समस्या: एक साइट फ़ोल्डर में सहेजी गई / अपलोड की गई फ़ाइलें दूसरे तक पहुंच योग्य नहीं होंगी।
ग्रेग

मेरा जवाब @Stewart :)
geerlingguy

केंद्रीय फाइल फोल्डर में सिमिलिंक बनाएं
केविन

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 फ़ाइलों का ट्रैक भी नहीं रखना पड़ेगा।


मुझे व्यक्तिगत रूप से लगता है कि यह जाने का सबसे अच्छा तरीका है। हालाँकि, हमारा सेट अप हम Apache config में SetEnv स्टेटमेंट जोड़ते हैं। इसे थोड़ा और सुरक्षित बनाता है।
स्कॉट जौड्री डिक

यह .htaccess और वैरिएबल स्टोरेज के लिए एक दिलचस्प उपयोग है। लेकिन जब आप दौड़ते हैं तो क्या होता है drush up --y? वह आपकी आधार .htaccess फ़ाइल को अधिलेखित कर देगा।
स्क्रीनकेक

यह .htaccesswebroot के ऊपर एक फ़ाइल में किया जाता है । उदाहरण के लिए, /var/www/.htaccessइन निर्देशों को संग्रहीत करता है, और /var/www/drupal/.htaccessDrupal का होगा .htaccess। आप इसे अपाचे वर्चुअल होस्ट कॉन्फ़िगरेशन में भी डाल सकते हैं, जो कि अच्छा भी है। चाहे जो भी हो, हमारे पास लगभग हमेशा वेबरोट में कस्टम सामान होता है .htaccessऔर इसलिए अगर हम ड्रुपल को अपडेट करते हैं तो हमें .htaccessगिट के साथ बदलाव की तुलना करने की आवश्यकता है ।
चार्ली श्लिसेर

0

सबसे सरल और सबसे कुशल समाधान जो सिर्फ एक पंक्ति है वह निम्नलिखित है। बस इसे अपनी सेटिंग की अंतिम पंक्ति में शामिल करें। पीडीएफ फाइल:

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

सामने वाले @ प्रतीक का अर्थ यह है कि यदि वह फ़ाइल नहीं ढूंढता है तो भी कोई त्रुटि प्रदर्शित नहीं करता है। विशिष्ट सेटअप की तरह इसमें यह जाँचने के लिए एक सशर्त शामिल है कि क्या फ़ाइल है। यह इसके बिना एक पंक्ति में पूरा करता है।

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

जिसे STFU PHP ऑपरेटर के रूप में भी जाना जाता है ।


सरल, लेकिन मुझे सबसे कुशल नहीं लगता। seanmonstar.com/post/909029460/…
AyeshK
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.