使用CodeIgniter网站解决多服务器环境问题

时间:2010-02-10 19:51:46

标签: codeigniter

我为基于CodeIgniter的站点提供了本地,登台和生产环境。我越来越多地发现每次部署版本时,由于服务器的不同,我会有越来越多的代码需要更改。

我可以添加一个好的(和快速)解决方案,这将允许我通过仅使用一个设置来设置这些变量。哪个是在index.php中插入它的最佳位置,某种钩子?

5 个答案:

答案 0 :(得分:6)

如果您正在使用Apache,则可以设置一个环境变量,该变量可由PHP在该站点的虚拟主机文件中读取:

<VirtualHost *:80>
    DocumentRoot /path/to/site
    ServerName local.mysite.com
    ErrorLog /path/to/error_log
    CustomLog /path/to/access_log common
    <Directory /path/to/site>
        SetEnv ENVIRONMENT local
        RewriteEngine On
        Options FollowSymLinks Indexes
        AllowOverride AuthConfig Options FileInfo
    </Directory>
</VirtualHost>

因此,您现在可以在index.php文件中相应地检查并设置服务器环境:

// always default to production for safety
$environment = 'production';

// check for an environment override
if (function_exists('apache_getenv') && apache_getenv("ENVIRONMENT")) {
  $environment = apache_getenv("ENVIRONMENT");
} else if (getenv("ENVIRONMENT")) {
  $environment = getenv("ENVIRONMENT");
}

// set the environment constant
define('ENVIRONMENT', $environment);

通过此设置,您现在可以自由地部署站点并为每个环境的application/config/[file].php文件添加其他配置参数。

替代...

处理多环境设置的另一种可能性是在文档根目录之外创建一个文件,并被包含服务器环境值的版本控制系统(即.gitignore)忽略。然后,您可以通过file_get_contents()或同等文件读取该文件。

答案 1 :(得分:2)

定义一个“LIVE”常量,该常量基于当前域(或将其放在index.php文件中)为TRUE或FALSE

if(strpos($_SERVER['HTTP_HOST'], 'mylivesite.com'))
{
    define('LIVE', TRUE);
}
else
{
    define('LIVE', FALSE);
}

然后检查您是否在线并相应地分配变量

if(LIVE)
{
    $active_group = "production";
}
else
{
    $active_group = "test";
}

我在过去一年的5环境设置中一直这样做,没有问题

答案 2 :(得分:2)

一个老问题,但Codeigniter Reactor支持现在内置的环境变量。您只需打开index.php文件并选择您的环境。这里有一篇关于他们的帖子:http://ilikekillnerds.com/2011/03/how-to-use-codeigniter-reactor-environment-variables/

答案 3 :(得分:1)

官方CodeIgniter doc建议多个数据库环境:

config.php文件中的Gobal变量来设置环境:

$ active_group =“test”;

database.php中的多个设置

$db['test']['hostname'] = "localhost";
$db['test']['username'] = "root";
$db['test']['password'] = "";
$db['test']['database'] = "database_name";
...

$db['production']['hostname'] = "example.com";
$db['production']['username'] = "root";
$db['production']['password'] = "";
$db['production']['database'] = "database_name";
...

有关详细信息,请参阅文档。

答案 4 :(得分:1)

由于服务器的变化而导致许多代码变化,这是一个不好的迹象,表明您正在修改不应该为应用程序修改的代码。您应该在服务器之间更改的唯一事项是位于config.php中的配置变量,它应具有默认值,供开发人员根据环境进行更改。