คำแนะนำสำหรับ settings.php - Local dev, เซิร์ฟเวอร์เพื่อการพัฒนา, เซิร์ฟเวอร์สด


80

โดยทั่วไปแล้วหนึ่งในคำถามที่ยิ่งใหญ่ที่สุดตลอดกาล: มีวิธีใดบ้างที่คุณใช้ settings.php ในขั้นตอนการพัฒนา / จัดเตรียมเวิร์กโฟลว์

ตอนนี้ฉันมีไฟล์ settings.php ของฉันตั้งค่าดังต่อไปนี้และฉันยึดการพัฒนาของฉันตามคำสั่ง $ HOST ของเซิร์ฟเวอร์ - หมายถึงฉันสามารถทำงานบน dev.example.com สำหรับเซิร์ฟเวอร์การพัฒนา (แชร์), local.example com สำหรับคอมพิวเตอร์ในพื้นที่ของฉัน (และการตรวจสอบรหัสท้องถิ่นอื่น ๆ ของ dev) และ 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 multi-site solution 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 สำหรับ bikeshed ผมแนะนำให้ใช้ 'settings.local.php' เป็นชื่อไฟล์ที่ตรงกับรูปแบบที่กำหนดโดย 'settings.default.php'
Dave Reid

1
ฉันได้สร้างส่วนสำคัญสำหรับการนี้: gist.github.com/1235389 ตั้งแต่ฉันได้รับการใช้นี้มากขึ้นและบ่อยครั้งมากขึ้น
chrisjlee

4
หมายเหตุ: Drupal 8 ได้เพิ่มส่วนย่อยที่คล้ายกันลงในไฟล์การตั้งค่าตามค่าเริ่มต้นคุณเพียงแค่ไม่ต้องใส่เครื่องหมายข้อคิดเห็น
Berdir

1
@DaveReid: รูปแบบถูกกำหนดโดย ' default.settings.php ' ไม่ใช่โดย 'settings.default.php'
iconoclast

1
สำหรับ funsies คุณสามารถใช้แทน (__DIR__) พวกเขาจะเทียบเท่า dirname(__FILE__)
cdmo

26

ดูเหมือนว่าคุณกำลังสร้างสรรค์นวัตกรรมการทำงานหลายฟังก์ชันของ Drupal ขึ้นใหม่

ส่วนตัวผมให้รูปแบบมาตรฐานและโมดูลสำหรับเว็บไซต์ในsites/allแล้วและได้และsites/dev.example.comsites/example.com

เป็นโบนัสที่เพิ่มเข้ามาคุณสามารถมีfilesโฟลเดอร์ที่แตกต่างกันสำหรับแต่ละไซต์และคุณสามารถเพิ่มโมดูลการพัฒนาใด ๆ ได้sites/dev.example.com/modulesเช่นกัน


แต่ฉันมีบางไซต์ที่มีโฟลเดอร์ multisite 5-10 โฟลเดอร์แล้วและการมีธีมทั้งหมดสำหรับไซต์เหล่านั้นในไซต์ / ทั้งหมด / ธีมอาจเป็นเรื่องที่น่ารำคาญทีเดียว ไม่ต้องพูดถึงการใช้ custom.module ตามปกติของฉันสำหรับแต่ละไซต์ ฉันเดาว่าฉันสามารถใช้ sitename_custom.module แทน: - /
geerlingguy

2
คุณสามารถลองใช้ลิงก์สัญลักษณ์จากsites/dev.example.com/modulesถึงsites/example.com/modules
Paul Jones เมื่อ

ยอมรับคำตอบนี้ - ฉันจะลองทำในเว็บไซต์ที่ฉันกำลังทำงานอยู่ ดูเหมือนว่าเหมาะสำหรับเวิร์กโฟลว์ของฉัน
geerlingguy

9
ฉันคิดว่านี่เป็นวิธีที่ไม่ดีในการจัดการสภาพแวดล้อม dev และการจัดเตรียมเนื่องจากพวกเขาไม่ได้แตกต่าง / แยกไซต์จริง ๆ แล้วเป็นไซต์รุ่นเดียวกันเท่านั้น ในกรณีนี้คุณต้องการหลีกเลี่ยงไฟล์แยกต่างหากสำหรับแต่ละไซต์ ฉันขอแนะนำอย่างมากให้ใช้วิธีการที่ระบุไว้ด้านล่างนี้ซึ่ง settings.php เป็นรุ่นและการตั้งค่าเฉพาะสำหรับแต่ละไซต์ (การตั้งค่า DB) จะถูกใส่ไว้ใน local.settings.php ที่ไม่ใช่เวอร์ชัน
Mikey P

1
@ Mikey P - การแก้ปัญหาทั้งสองใช้ได้ - ฉันคิดว่าส่วนใหญ่ขึ้นอยู่กับความชอบส่วนบุคคล / ทีมที่นี่ ... มีการแลกเปลี่ยนกับวิธีการอย่างใดอย่างหนึ่งในความคิดของฉัน
geerlingguy

10

ฉันชอบที่จะเพิกเฉยต่อไฟล์ในเครื่อง (โดยใช้.gitignoreไฟล์ในคอมไพล์) แล้วแยกเวอร์ชันหากไฟล์ในแต่ละโฮสต์


1
นี่เป็นวิธีแก้ปัญหาที่น่าสนใจ แต่ฉันชอบติดตาม settings.php ในคอมไพล์ (ข้อบกพร่องบางอย่างที่ฉันมีมาเนื่องจากการตั้งค่า. php เปลี่ยนแปลง ... ) มีวิธีที่ฉันสามารถใช้เช็คเอาต์ git ในพื้นที่ของฉันแทนที่ไฟล์นั้นด้วยตัวเอง (นอกเหนือจากการให้ฉันคัดลอกในไฟล์ของตัวเอง)?
geerlingguy

1
นั่นคือสิ่งที่ฉันทำ ไฟล์ที่มีข้อมูลการกำหนดค่าโดยเฉพาะอย่างยิ่งกับข้อมูลรับรองฐานข้อมูลไม่มีตำแหน่งใน VCS
mmartinov

@geerlingguy ใช่คุณทำได้ โปรดอ่านการอัปเดตของฉัน (หากมีการเผยแพร่;)
sobi3ch

@martin ฉันเห็นด้วย แต่อย่าลืมว่าเราสามารถมี repo แยกพิเศษสำหรับไฟล์นี้เท่านั้น! คุณสามารถอ่านได้ในการปรับปรุงของฉัน
sobi3ch

7

ฉันมักจะตั้งค่า DNS หรือโฮสต์ไฟล์รายการและใช้

dev.example.com
staging.example.com

และ

example.com

จากนั้นฉันก็แยกไดเรกทอรีไฟล์การตั้งค่าอย่างสมบูรณ์ด้วยไดเรกทอรีไฟล์ที่แตกต่างกัน ตัวอย่างเช่น. /sites/dev.example.com/files


ปัญหาที่ฉันเห็นด้วยวิธีการนั้นคือฉันมักจะมี / themes / และ / modules / directory ที่ฉันใช้สำหรับแต่ละไซต์ (มักจะอยู่ในการตั้งค่าแบบหลายไซต์) และเนื่องจากฉันต้องใช้โมดูลและธีมเฉพาะสำหรับไซต์เหล่านั้น , dev และการผลิต, ฉันไม่สามารถทำโฮสต์ / หลายไซต์เช่นนั้น: - /
geerlingguy

จุดดี. ฉันเดาว่าฉันเหลือสิ่งที่ฉันเชื่อมโยงสิ่งนั้นค่ะ
สจ๊วตโรบินสัน

คุณสามารถสร้าง symlink และใช้ธีมและโฟลเดอร์โมดูลร่วมกันได้ ดังนั้นโดยทั่วไปโฟลเดอร์หลักของคุณจะเป็นโฟลเดอร์การผลิตและจากนั้นคุณสามารถสร้าง symlink ไปยังสเตจและ dev และโลคัล
gansbrest

5

ทำไมไม่มีโฟลเดอร์บางโฟลเดอร์ตามชื่อโฮสต์การพัฒนา

ตัวอย่าง

  • เว็บไซต์ / dev1.domain.com
  • เว็บไซต์ / dev2.domain.com
  • เว็บไซต์ / dev3.domain.com
  • เว็บไซต์ / www.domain.com

แต่ละไฟล์มีการตั้งค่าของตัวเองและ db_url


ปัญหาที่อาจเกิดขึ้น: ไฟล์ที่บันทึก / อัพโหลดในโฟลเดอร์ไซต์หนึ่งจะไม่สามารถเข้าถึงได้โดยอีกโฟลเดอร์หนึ่ง
Greg

ดูคำตอบของฉันที่ @Stewart :)
geerlingguy

สร้าง symlink ไปยังโฟลเดอร์ไฟล์กลาง
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 ทำให้ปลอดภัยขึ้นอีกเล็กน้อย
Scott Joudry

นั่นคือการใช้ที่น่าสนใจสำหรับ. htaccess และที่เก็บข้อมูลตัวแปร แต่สิ่งที่เกี่ยวกับเมื่อคุณเรียกใช้drush up --y? ที่จะเขียนทับไฟล์. htaccess พื้นฐานของคุณ
Screenack

สิ่งนี้ทำได้ใน.htaccessไฟล์ที่อยู่เหนือระดับ webroot ยกตัวอย่างเช่น/var/www/.htaccessเก็บคำสั่งเหล่านี้และ/var/www/drupal/.htaccessจะเป็นของ .htaccessDrupal คุณสามารถวางไว้ในการกำหนดค่าโฮสต์เสมือนของ Apache ซึ่งยังดีกว่า ไม่ว่าจะมีอะไรก็ตามเราเกือบจะมีของที่กำหนดเองใน webroot .htaccessและถ้าเราอัพเดท Drupal เราต้องเปรียบเทียบการ.htaccessเปลี่ยนแปลงกับ Git
Charlie Schliesser

0

วิธีที่ง่ายและมีประสิทธิภาพที่สุดที่เป็นเพียงหนึ่งบรรทัดมีดังต่อไปนี้ เพียงรวมไว้ในบรรทัดสุดท้ายของไฟล์ settings.php ของคุณ:

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

สัญลักษณ์ @ ที่ด้านหน้าหมายถึงไม่แสดงข้อผิดพลาดแม้ว่าจะหาไฟล์นั้นไม่พบก็ตาม การตั้งค่าทั่วไปเช่นนี้เกี่ยวข้องกับเงื่อนไขเพื่อตรวจสอบว่ามีไฟล์อยู่หรือไม่ สิ่งนี้จะสำเร็จได้ในบรรทัดเดียวโดยปราศจากมัน

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

ยังเป็นที่รู้จักในฐานะผู้ประกอบการหุบปาก PHP


เรียบง่าย แต่ฉันไม่คิดว่ามีประสิทธิภาพมากที่สุด seanmonstar.com/post/909029460/…
AyeshK
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.