settings.php的建议-本地开发人员,开发服务器,实时服务器


80

基本上,这是有史以来最大的问题之一:在开发/登台工作流程中使用settings.php有哪些方式?

现在,我已经按照如下所示设置了settings.php文件,并且我的开发基于服务器的$ HOST指令进行,这意味着我可以在dev.example.com上开发(共享)服务器local.example。 com(用于我的本地计算机)(以及其他开发人员的本地代码结帐),以及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多站点解决方案drupal.org/node/290768
sobi3ch 2015年

Answers:


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上始终使用。对于单车棚,我建议使用“ settings.local.php”作为文件名,因为它与“ settings.default.php”设置的模式匹配。
Dave Reid

1
我为此创建了一个要点:gist.github.com/1235389, 因为我越来越频繁地使用它
chrisjlee 2011年

4
注意:默认情况下,Drupal 8现在默认情况下已将类似的代码片段添加到设置文件,您只需要取消注释即可:drupal.org/node/1118520
Berdir 2012年

1
@DaveReid:该模式由“ default.settings.php ” 设置,而不是由“ settings.default.php”设置。
iconoclast

1
对于娱乐,您可以使用(__DIR__)代替dirname(__FILE__)它们是等效的
cdmo

26

似乎您正在重塑Drupal的内置多站点功能。

我个人将网站的所有标准主题和模块保存在中sites/all,然后包含sites/dev.example.comsites/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

接受此答案-我将在我当前正在工作的网站上尝试该问题。看起来很适合我的工作流程。
geerlingguy 2011年

9
我认为这实际上是处理开发和暂存环境的糟糕方法,因为它们实际上不是不同/分离的站点,而只是同一站点的不同版本。在这种情况下,您非常想避免每个站点都有单独的文件。我非常推荐使用下面提到的方法,其中settings.php被版本化,并且特定于每个站点的设置(数据库设置)被放置在local.settings.php中而不是版本中。
Mikey P

1
@Mikey P-两种解决方案都有效-我认为这在很大程度上取决于个人/团队的偏爱...我认为这两种方法都需要权衡。
geerlingguy

10

我更喜欢忽略本地文件(.gitignore在git中使用文件),然后在每个主机上都保留单独的版本。


1
这是一个有趣的解决方案,尽管我确实喜欢在git中跟踪settings.php(我遇到的一些错误是由于setting.php的更改引起的)。有没有办法让我的本地git checkout用我自己的文件替换该文件(除了让我在自己的文件中复制)?
geerlingguy 2011年

1
我也是。具有配置数据(尤其是具有数据库凭据)的文件在VCS中没有位置。
mmartinov 2011年

@geerlingguy是的,您可以。请阅读我的更新(如果它将发布;)
sobi3ch 2015年

@martin我同意,但让我们不要忘记,我们只能为该文件提供SPECIAL单独的存储库!您可以在我的更新中阅读。
sobi3ch 2015年

7

我倾向于总是设置DNS或主机文件条目并使用

dev.example.com
staging.example.com

example.com

然后,我将使用完全不同的文件目录来设置文件目录。例如./sites/dev.example.com/files


我看到的这种方法的问题是,我经常在每个站点上使用一个/ themes /和/ modules /目录(通常在多站点设置中),并且由于我需要在本地使用这些站点特定的模块和主题,开发和生产,我不能只做这样的主机/多站点:-/
geerlingguy 2011年

好点子。我想我离开了,我的符号链接是东西英寸
斯图尔特·罗宾逊

您可以创建符号链接并以这种方式共享主题和模块文件夹。因此,基本上,您的主文件夹将是生产文件夹,然后您可以从其中创建指向舞台,开发人员和本地的符号链接。
gansbrest 2011年

5

为什么没有几个基于开发主机名的文件夹?

  • sites / dev1.domain.com
  • sites / dev2.domain.com
  • sites / dev3.domain.com
  • 网站/www.domain.com

每个都有自己的设置文件和db_url。


潜在问题:在一个站点文件夹中保存/上传的文件将无法被另一个站点访问。
格雷格

请参阅我对@Stewart的回复:)
geerlingguy 2011年

创建指向中央文件文件夹的符号链接
凯文

2

如果唯一改变的只是数据库凭据,则可以在本地(和分段/生产)虚拟主机配置中或在.htaccess中,在Web根目录上方的文件夹中设置环境变量。这是一个简单的例子:

/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_url = "mysql://{$_SERVER['DB1_USER']}:{$_SERVER['DB1_PASS']}@{$_SERVER['DB1_HOST']}:{$_SERVER['DB1_PORT']}/{$_SERVER['DB1_NAME']}";

这样一来,多个开发人员可以在本地运行事务,并且可以继续进行阶段/生产,同时仍可以跟踪settings.php(其中不仅仅是数据库凭据,还有更多的事情……)。您也不必跟踪多个settings.php文件。


我个人认为这是最好的方法。但是,我们的设置是将SetEnv语句添加到apache配置中。使它更加安全。
Scott Joudry 2013年

这是.htaccess和变量存储的有趣用法。但是跑步的时候drush up --y呢?这将覆盖您的基本.htaccess文件。
Screenack

这是在.htaccess高于webroot 的文件中完成的。例如,/var/www/.htaccess存储这些指令,并且/var/www/drupal/.htaccess将是Drupal的.htaccess。您也可以将其放在Apache虚拟主机配置中,这甚至更好。无论哪种情况,我们几乎都在Webroot中拥有自定义内容.htaccess,因此,如果更新Drupal,则需要将.htaccess更改与Git 进行比较。
Charlie Schliesser 2014年

0

下面是仅需一行的最简单,最有效的解决方案。只需将其包含在settings.php文件的最后一行即可:

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

前面的@符号仅表示即使未找到该文件也不显示任何错误。像这样的典型设置涉及到条件检查文件是否存在。如果没有它,这将在一行中完成。

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

也称为STFU PHP运算符


很简单,但我认为效率最高。seanmonstar.com/post/909029460/...
AyeshK
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.