繁体   English   中英

如何在PHP环境之间更改不同的配置设置?

[英]How to change different configuration settings between environments in PHP?

我有一些通过AJAX调用的php文件。 它们都有指向我的config.php的URL。 现在,我遇到的问题是,当我在服务器上部署新版本时,总是必须手动将URL更改为该配置文件。

本地路径:

define('__ROOT__', $_SERVER["DOCUMENT_ROOT"].'/mywebsite');

服务器路径:

define('__ROOT__', $_SERVER["DOCUMENT_ROOT"].'/../dev.my-website.tld/Modules/');

我想跟踪所有这些PHP文件中的更改。 我正在寻找一种自动更改此路径的解决方案。

例如,这是我当前的工作流程:

当地环境:

  • (路径版本A)
  • 在代码中进行更改
  • git add,git commit,git merge,git push到我的服务器

服务器:

  • git reset --hard
  • 更改版本B的路径

您正在尝试在开发和运行之间运行不同的代码库,不建议这样做-它们应该相同。 我解决此问题的方法是使用环境变量来指定应加载几个配置文件中的哪个。

在我的Apache vhost中,我执行以下操作:

SetEnv ENVIRONMENT_NAME local

然后,我使用一个函数来读取环境名称:

function getEnvironmentName()
{
    $envKeyName = 'ENVIRONMENT_NAME';
    $envName = isset($_SERVER[$envKeyName]) ? $_SERVER[$envKeyName] : null;
    if (!$envName)
    {
        throw new \Exception('No environment name found, cannot proceed');
    }

    return $envName;
}

然后,可以在配置文件中使用该环境名称以include ,或从键入环境的单个数组中检索值。

我通常将特定于环境的设置保存在名为configs/的文件夹中,但是您可以将其存储在应用程序中任何有意义的位置。 因此,例如,您可以拥有以下文件:

// This is /configs/local.php

return array(
    'path' => '/mywebsite',
    // As many key-values as you want
);

然后,您可以执行此操作(假设前端控制器在项目中位于一个层次深处,例如/web/index.php ):

$root = dirname(__DIR__);
$config = include($root . '/configs/' . getEnvironmentName() . '.php');

然后,您可以在$config访问相应的每个环境设置。

达到此目的的纯git方法将是filter 过滤器很酷,但经常被忽略。 将过滤器视为可以完全控制的git关键字扩展方式。

例如,文件的签入版本将如下所示:

define('__ROOT__', 'MUST_BE_REPLACED_BY_SMUDGE');

然后设置两个过滤器:

  • 在本地计算机上,您将设置一个smudge过滤器来替换
    'MUST_BE_REPLACED_BY_SMUDGE'

    $_SERVER["DOCUMENT_ROOT"].'/mywebsite'

  • 在您的服务器上,您将设置一个smudge过滤器来替换
    'MUST_BE_REPLACED_BY_SMUDGE'

    $_SERVER["DOCUMENT_ROOT"].'/../dev.my-website.tld/Modules/'

  • 在两台机器上, clean过滤器都会将线路恢复为
    define('__ROOT__', 'MUST_BE_REPLACED_BY_SMUDGE');

有关过滤器的更多信息,可以在此答案Git Book中找到

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM