在同一台服务器上为同一项目的不同版本加载配置文件的最佳方法是什么?

时间:2009-05-19 17:08:53

标签: php configuration-management

我有一个很大的php项目,它依赖于两个级别的配置文件。

在我的项目文件夹中,我有一个default.config.ini,它被加载,然后与特定于站点的配置文件合并。

目前代码正在读取指向特定配置文件的环境变量PROJECT_CONFIG。这适用于在自己的机器上工作的每个开发人员。当我们将项目移动到服务器并希望拥有同一项目的三个实例时,就会出现问题:Dev,Stage,Live。

我们现在不再可以使用全局env var,因为它需要与每个子域不同(项目设置为dev.domain.com,stage.domain.com和www.domain.com)。

我考虑将服务器变量HTTP_HOST转换为env var名称并使用它来设置正确的配置(即当用户从dev.domain.com请求页面时,代码会查找env var叫dev_domain_com),但我想看看其他人在做什么以及他们推荐什么。

任何建议都将非常感谢,提前谢谢

3 个答案:

答案 0 :(得分:2)

使用apache的SetEnv指令在容器中设置PROJECT_CONFIG,以配置对应用程序实例的访问:

SetEnv PROJECT_CONFIG /src/dev/app.config.php

答案 1 :(得分:2)

David Schmitt的想法是最优雅的。我可以看到使用$_SERVER['HTTP_HOST']来确定您所在的服务器并相应地设置路径的情况。如果您没有权限修改服务器的虚拟主机配置文件,则可能就是这种情况。例如:

<?php
  switch($_SERVER['HTTP_HOST']){
    case 'dev.domain.com':
      $path = '/home/dev_user/project.config.ini';
      break;
    case 'stage.domain.com':
      $path = '/home/stage_user/project.config.ini';
      break;
    case 'www.domain.com':
      $path = '/home/live_user/project.config.ini';
      break;
    default:
      $path = '';
  }
  if(!defined('PROJECT_CONFIG')){
    define('PROJECT_CONFIG', $path);
  }
  unset($path);
?>

注意:根据您的服务器配置,您可能希望将$_SERVER['HTTP_HOST']替换为$_SERVER['SERVER_NAME']

答案 2 :(得分:0)

我认为您当前的解决方案很好。毕竟环境设置有一个原因。我已经看到了你曾经用过的大型专有cms做事的方式。

我需要做同样的事情,让dev / stage / production站点加载不同的配置并计划使用环境设置,如果没有设置env设置,让它检测主机名作为后备。