题
我正在开发一个系统在Cake,令的版本控制系统。我有一个工作复制在我的测试服务器和另一个在我的生产服务器、两用不同的数据库。每次我做出改变,我需要改变数据库的配置,所以我可以试验的系统。是否有另一种方式,以保持两个文件,内容不同,一个在试验和另一个生产服务器?分支机构是一个良好的路要走呢?
解决方案
我已经走了一个相当粗而有效的技术:在我的发展环境,我有一个空的文件中被称为'environment_development'.我在生产环境中我有一个称为'environment_PRODUCTION'(不同的情况下,为了增加些重点).我gitignore文件被设定要忽略既有的这些。
前控制我的应用程序(I使用Kohana框架,但是我假定Cake有类似的东西)检查是否存在这些文件并设置一IN_PRODUCTION常适当。其他代码(数据库的配置、差错的处理等。) 可以检查价值的这一恒定和改变行为所必需的。
我用来使用$_SERVER['SERVER_NAME']检查,但这种方法具有以下优点:
- 它的工作,即使有份你的你想从命令行运行,例如,如cronjobs,当$_SERVER没有设置。
- 它的工作,甚至如果你的应用程序运行在多个领域。
- 这完全是明确的:如果某人检查了另一个工作副本的应用程序,没有什么会功能,直到他们创造一种环境的文件,因此没有(或很少)的机会有人跑码对发展的生产数据库或反之亦然。
其他提示
你不会想这样做有分支机构。我不能说话PHP具体的,但不是保持两个文件(试验的配置和生产配置)中单独的分支,你会让他们聚在一起,而只是让一个环境变量确定其配置是正确的使用在运行时间。
(这是它是如何做到的在轨,它工作得很好。)
如果该数据库是依赖的环境中,你可以做像这样的东西在 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;
}
}
}
不隶属于 StackOverflow