我正在使用Git作为版本控制系统在CakePHP中开发一个系统。我的测试服务器中有一份工作副本,生产服务器上有另一份工作副本,两者都有不同的数据库。每次我进行更改时,我都必须更改数据库配置,以便我可以测试系统。还有另一种方法可以保存两个文件,其中包含不同的内容,一个在测试中,另一个在生产服务器中?分店是一个很好的方式吗?
答案 0 :(得分:4)
您不希望分支机构这样做。我不能专门与PHP说话,但是不要将两个文件(测试配置和生产配置)保存在不同的分支中,而是将它们保持在一起,但只需让环境变量确定哪个配置是正确的配置即可使用在运行时。
(这是在Rails中完成的,它运行良好。)
答案 1 :(得分:1)
我选择了一种相当粗略但有效的技术:在我的开发环境中,我有一个名为'environment_development'的空文件。在我的生产环境中,我有一个名为'environment_PRODUCTION'(不同的情况,增加了视觉强调)。我的gitignore文件设置为忽略这两个。
我的应用程序的前端控制器(我使用Kohana框架,但我假设CakePHP有类似的东西)检查这些文件的存在并适当地设置IN_PRODUCTION常量。其余代码(数据库配置,错误处理等)可以检查此常量的值并根据需要更改行为。
我以前使用$ _SERVER ['SERVER_NAME']检查,但此方法具有以下优点:
答案 2 :(得分:0)
如果数据库依赖于环境,您可以在database.php
文件中执行以下操作:
class DATABASE_CONFIG {
var $default = NULL;
var $prod = array(
'driver' => 'mysql',
'persistent' => false,
'host' => 'localhost',
'login' => 'username',
'password' => 'password',
'database' => 'productionDatabaseName',
'prefix' => '',
);
var $staging = array(
'driver' => 'mysql',
'persistent' => false,
'host' => 'localhost',
'login' => 'username',
'password' => 'password',
'database' => 'stagingDatabaseName',
'prefix' => '',
);
//var $dev = ...
// Chooses production or staging depending on URL
function __construct ()
{
if(isset($_SERVER['SERVER_NAME']))
{
switch($_SERVER['SERVER_NAME'])
{
case 'myhostname.com':
case 'www.myhostname.com':
$this->default = $this->prod;
break;
case 'staging.myhostname.com':
$this->default = $this->staging;
break;
default:
$this->default = $this->dev;
}
}
else // Use local for any other purpose
{
$this->default = $this->dev;
}
}
}