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

时间:2014-12-22 10:04:39

标签: php git gulp

我有几个php文件,我通过AJAX调用调用。它们都有我的config.php的URL。现在,当我在服务器上部署新版本时,我总是需要手动将URL更改为该配置文件。

本地路径:

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

服务器路径:

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

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

E.g。 这是我目前的工作流程:

当地环境:

  • (路径版本A)
  • 在代码中进行更改
  • git add,git commit,git merge,git push to my server

服务器:

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

2 个答案:

答案 0 :(得分:3)

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

在我的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中相应的每个环境设置。

答案 1 :(得分:1)

实现这一目标的纯粹方法是filters。过滤器非常酷但经常被忽视。将过滤器视为您可以完全控制的关键字扩展的一种方式。

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

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');

有关过滤器的更多信息,请参见this answerGit Book