Php 如何在CodeIgniter中有条件地加载配置文件?
我需要在我的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
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));