Php 如何在CodeIgniter中有条件地加载配置文件?

Php 如何在CodeIgniter中有条件地加载配置文件?,php,codeigniter,Php,Codeigniter,我需要在我的CodeIgniter项目中创建类似于以下内容的内容:- my_config.php config\u production.php config_development.php 现在,my_config.php将自动加载。如果是生产服务器,则从那里加载config\u production.php;否则将加载config_development.php 我应该如何执行这个 我已尝试在my_config.php中执行以下操作: <?php if(gethostbyaddr

我需要在我的CodeIgniter项目中创建类似于以下内容的内容:-

  • my_config.php
  • config\u production.php
  • config_development.php
现在,
my_config.php
将自动加载。如果是生产服务器,则从那里加载
config\u production.php
;否则将加载config_development.php

我应该如何执行这个

我已尝试在my_config.php中执行以下操作:

<?php
if(gethostbyaddr ("127.0.0.1") == 'hello.sabya'){
    $this->config->load('config_production');
} else {
    $this->config->load('config_development');
}
?>


由于
$this->config
未初始化,它不工作。如何实现这一点?

何时需要初始化配置?-在初始化其他所有内容后但在控制器执行之前,您是否可以定义一个来加载正确的配置?

两个选项:您可以尝试使用“$CI”而不是“$this”引用对象:

…这是从外部引用CI对象的正确方法

其次,您可以从config.php文件中切换配置:

<?php
if(gethostbyaddr ("127.0.0.1") == 'hello.sabya'){
    $config['base_url'] = "http://dev.example.com/";
} else {
    $config['base_url'] = "http://prod.example.com/";

}
?>


……等等。加载两个if/else块之间的所有差异。

我让它这样工作:-

$ci = & get_instance();

if (gethostbyaddr ("127.0.0.1") == 'production.example.com') {
    //Load production configuration
    $ci->load->config('config_production');
} elseif(gethostbyaddr ("127.0.0.1") == 'staging.example.com') {
    //Load staging configuration
    $ci->load->config('config_staging');
} else {
    //Load development configuration
    $ci->load->config('config_development');
} 

我在我的案例中使用这个。对于index.php

switch ($_SERVER['SERVER_NAME']) {
case 'localhost':
    define('ENVIRONMENT', 'development');
    break;
case 'example.com':
    define('ENVIRONMENT', 'production');
    break;
default:
    define('ENVIRONMENT', 'production');
    break;
}
对于application/config.php中的base_url:

switch ($_SERVER['SERVER_NAME']) {
case 'localhost':
    $config['base_url'] = "http://localhost/my_app/";
    break;
case 'example.com':
    $config['base_url'] = "http://example.com/";
    break;
default:
    $config['base_url'] = "http://example.com/";
    break;
}
对于application/database.php中的数据库:

switch ($_SERVER['SERVER_NAME']) {
case 'localhost':
    $db['default']['username'] = 'root';
    $db['default']['password'] = '123456';
    break;
case 'example.com':
    $db['default']['username'] = 'user';
    $db['default']['password'] = 'pass';
    break;
default:
    $db['default']['username'] = 'user';
    $db['default']['password'] = 'pass';
    break;
}

为什么不使用环境

此外,配置文件只是数组。为什么不包括它并将其与现有阵列合并?或者在index.php中更好:

if (gethostbyaddr ("127.0.0.1") == 'production.example.com')
{
    include(APPPATH.'config/config_production.php');
}
elseif (gethostbyaddr ("127.0.0.1") == 'staging.example.com')
{
    include(APPPATH.'config/config_staging.php');   
}
else
{
    include(APPPATH.'config/config_development.php');
}

foreach ($config AS $key => $item)
{
    $assign_to_config[$key] = $item;
}
但在我看来,最好的方法是使用环境

正如Eric提到的使用

根据当前配置,您可以加载不同的配置文件 环境

要创建特定于环境的配置文件,请创建或复制 中的配置文件 application/config/{ENVIRONMENT}/{FILENAME}.php

注意:CodeIgniter始终尝试加载的配置文件 首先是当前的环境。如果文件不存在,则全局 配置文件(即application/config/中的文件)已加载。这 意味着您没有义务放置所有配置文件 在环境文件夹中− 仅限根据更改的文件 环境


既然逻辑已经存在,为什么还要实现它呢?;)

这是一个古老的问题,已经有了一个公认的答案,但我已经想出了一个我认为行之有效的解决方案。正如@Eric提到的,最好的方法是使用环境变量的内置功能来确定配置逻辑。我在这种方法中遇到的问题是,它需要维护大量冗余值,您通常需要一个针对所有环境运行的中央默认配置,并且只有特定于环境的值才能替换默认值

您的文件夹结构应为:

/app/config/config.php
/app/config/development/config.php
/app/config/production/config.php
然后,在特定于环境的配置文件中,使用以下内容作为起点:

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

// Set the default values first, then we'll overwrite environmental-specific values
include(APPPATH . '/config/' . pathinfo(__FILE__, PATHINFO_BASENAME));
出于“更好的实践”,您可能应该做如下操作:$host=gethostbyaddr(“127.0.0.1”);如果($host=='production.example.com'){这样您只需要调用gethostbyaddr一次。
<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

// Set the default values first, then we'll overwrite environmental-specific values
include(APPPATH . '/config/' . pathinfo(__FILE__, PATHINFO_BASENAME));