我正在开发一个系统在Cake,令的版本控制系统。我有一个工作复制在我的测试服务器和另一个在我的生产服务器、两用不同的数据库。每次我做出改变,我需要改变数据库的配置,所以我可以试验的系统。是否有另一种方式,以保持两个文件,内容不同,一个在试验和另一个生产服务器?分支机构是一个良好的路要走呢?

有帮助吗?

解决方案

我已经走了一个相当粗而有效的技术:在我的发展环境,我有一个空的文件中被称为'environment_development'.我在生产环境中我有一个称为'environment_PRODUCTION'(不同的情况下,为了增加些重点).我gitignore文件被设定要忽略既有的这些。

前控制我的应用程序(I使用Kohana框架,但是我假定Cake有类似的东西)检查是否存在这些文件并设置一IN_PRODUCTION常适当。其他代码(数据库的配置、差错的处理等。) 可以检查价值的这一恒定和改变行为所必需的。

我用来使用$_SERVER['SERVER_NAME']检查,但这种方法具有以下优点:

  1. 它的工作,即使有份你的你想从命令行运行,例如,如cronjobs,当$_SERVER没有设置。
  2. 它的工作,甚至如果你的应用程序运行在多个领域。
  3. 这完全是明确的:如果某人检查了另一个工作副本的应用程序,没有什么会功能,直到他们创造一种环境的文件,因此没有(或很少)的机会有人跑码对发展的生产数据库或反之亦然。

其他提示

你不会想这样做有分支机构。我不能说话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;
        }
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top