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


How to change different configuration settings between environments in PHP?

我有几个通过AJAX调用调用的php文件。他们都有一个指向我的配置.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 to my server

服务器:

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

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

在我的Apachevhost中,我做了这样的事情:

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 方法是过滤器。过滤器很酷,但经常被忽视。将过滤器视为您可以完全控制的关键字扩展的 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 手册。