设置测试和生产环境

时间:2009-06-12 13:21:41

标签: git frameworks environments

我正在使用Git作为版本控制系统在CakePHP中开发一个系统。我的测试服务器中有一份工作副本,生产服务器上有另一份工作副本,两者都有不同的数据库。每次我进行更改时,我都必须更改数据库配置,以便我可以测试系统。还有另一种方法可以保存两个文件,其中包含不同的内容,一个在测试中,另一个在生产服务器中?分店是一个很好的方式吗?

3 个答案:

答案 0 :(得分:4)

您不希望分支机构这样做。我不能专门与PHP说话,但是不要将两个文件(测试配置和生产配置)保存在不同的分支中,而是将它们保持在一起,但只需让环境变量确定哪个配置是正确的配置即可使用在运行时。

(这是在Rails中完成的,它运行良好。)

答案 1 :(得分:1)

我选择了一种相当粗略但有效的技术:在我的开发环境中,我有一个名为'environment_development'的空文件。在我的生产环境中,我有一个名为'environment_PRODUCTION'(不同的情况,增加了视觉强调)。我的gitignore文件设置为忽略这两个。

我的应用程序的前端控制器(我使用Kohana框架,但我假设CakePHP有类似的东西)检查这些文件的存在并适当地设置IN_PRODUCTION常量。其余代码(数据库配置,错误处理等)可以检查此常量的值并根据需要更改行为。

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

  1. 即使您的应用程序中有部分要从命令行运行,例如cronjobs,但未设置$ _SERVER时,它仍然有效。
  2. 即使您的应用在多个域上运行,它仍然有效。
  3. 这是完全明确的:如果某人检查了应用程序的另一个工作副本,那么在创建环境文件之前什么都不会起作用,因此没有(或很少)有人在生产数据库上运行开发代码,反之亦然

答案 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;
        }
    }
}