2009-06-12 123 views
3

我正在CakePHP中開發一個系統,使用Git作爲版本控制系統。我在測試服務器上有一個工作副本,另一個在我的生產服務器上,都有不同的數據庫。每次我進行更改時,都必須更改數據庫配置,以便測試系統。是否有另一種方法來保存兩個文件,其中有不同的內容,一個在測試中,另一個在生產服務器中?分支機構是一個很好的途徑?設置測試和生產環境

回答

1

我已經有了一個相當粗糙而有效的技術:在我的開發環境中,我有一個名爲'environment_development'的空文件。在我的生產環境中,我有一個名爲'environment_prODUCTION'(不同情況下增加視覺重點)。我的gitignore文件被設置爲忽略這兩個。我的應用程序(我使用Kohana框架,但我假設CakePHP有類似的東西)的前端控制器檢查這些文件的存在並適當地設置IN_PRODUCTION常量。其餘的代碼(數據庫配置,錯誤處理等)可以檢查此常量的值並根據需要更改行爲。

我以前用的是$ _ SERVER [「SERVER_NAME」]檢查,但這種方法具有以下優點:

  1. 它的工作原理,即使有你的應用程序的部分要在命令行中運行例如,當cronjobs沒有設置$ _SERVER時。
  2. 即使您的應用在多個域上運行,它也能正常工作。這是完全明確的:如果有人簽出應用程序的另一個工作副本,那麼在創建環境文件之前沒有任何功能可用,所以沒有(或很少)有人對生產數據庫運行開發代碼,反之亦然。
4

你不想用分支做到這一點。我不能專門與PHP交流,但是不要將兩個文件(測試配置&生產配置)保存在不同的分支中,而是讓它們保持在一起,但是讓環境變量確定哪個配置是正確的配置運行。

(這是它是如何在Rails的做,效果很好。)

+1

我同意。您不想在您的版本控制軟件上花費過多的時間來處理與版本無關的事情。你最好將你的應用程序設計爲固有可測試的。 – 2009-06-12 19:39:56

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