3

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

4

3 回答 3

4

你不会想用分支来做到这一点。我不能专门与 PHP 交谈,但不是将两个文件(测试配置和生产配置)保存在单独的分支中,而是将它们放在一起,但只需让环境变量确定哪个配置是正确的运行。

(这就是它在 Rails 中的实现方式,并且运行良好。)

于 2009-06-12T13:30:03.783 回答
1

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

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

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

  1. 即使您想从命令行运行应用程序的某些部分,它也可以工作,例如,当 $_SERVER 未设置时,作为 cronjobs。
  2. 即使您的应用程序在多个域上运行,它也能正常工作。
  3. 这是完全明确的:如果有人签出该应用程序的另一个工作副本,则在他们创建环境文件之前什么都不会起作用,因此没有人(或很少)有机会针对生产数据库运行开发代码,反之亦然。
于 2009-06-12T14:18:12.730 回答
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;
        }
    }
}
于 2009-06-12T13:55:06.797 回答