2010-03-02 14 views
1

我在同一臺機器上有一個臨時和開發環境。我想根據我的環境在ProjectConfiguration.class.php中配置不同的memcached端口。我想在ProjectConfiguration文件中使用$ SERVER ['HTTP_HOST']是不安全的,因爲這不會解決從命令行運行的任務。如何在Symfony的ProjectConfiguration.class.php中引用不同的環境

什麼是完成什麼的這段代碼計劃的最佳途徑:

public function configureDoctrine(Doctrine_Manager $manager) { 

    if ($_SERVER['HTTP_HOST'] == 'dev.example.com') { 
     $memcached_port = 11211; 
    } else { 
     $memcached_port = 11212; 
    } 

    $servers = array(
     'host' => '127.0.0.1', 
     'port' => $memcached_port, 
     'persistent' => true); 
} 

回答

1

我使用HTTP主機在網絡控制器偵測到環境,並將其傳遞到項目配置實例,按這裏:

<?php 

require_once(dirname(__FILE__).'/../config/ProjectConfiguration.class.php'); 

$env = ProjectConfiguration::getEnvironment(); 
if (!in_array($env, array('dev'))) throw new Exception('Not Allowed'); 

$configuration = ProjectConfiguration::getApplicationConfiguration('frontend', $env, true); 
sfContext::createInstance($configuration)->dispatch(); 

這是來自frontend_dev.php - 因此它也確保您不能訪問除dev外的任何地方的dev控制器。

我的項目配置類包含被引用的方法,它做的工作:

public function getEnvironment() { 
    if ($_SERVER ['HTTP_HOST'] == 'dev.example.com') { 
    return 'dev'; 
    } else { 
    return 'prod'; 
    } 
} 

正如你正確地說,也有命令行任務來考慮 - 但幾乎所有symfony的任務將採取--env = xxx參數。我使用這些。無論如何,他們都默認爲開發,這是我做大部分工作的地方,所以它不像聽起來那麼艱難。

然後,我會在你的if語句中使用if (sfConfig::get('sf_environment') == 'dev'),而不是直接使用HTTP_HOST,它可以在cmd行和web上使用。

+0

這是一個可怕的方法。如果從命令行運行腳本,則默認爲prod可能會導致嚴重問題。我建議爲每個服務器添加一個服務器環境變量,指出是否產品或開發。 –

2

有兩種方法可以實現這一點。

首先,您應該在index.php中分別設置您的環境。我們通常將其設置爲prod,然後檢入文件,並手動將其更改爲在我們的開發服務器和本地計算機上進行開發,以便更輕鬆地部署。我也建議把這個文件放在.gitignore中,這樣它就不會被意外地改變。

  1. 使用app.yml配置文件。在您的app.yml配置中,設置一個名爲'memcache_port'的密鑰併爲每個環境分別設置值。 YAML的文件將是這個樣子:

    prod: 
        memcached_port: 11211 
    
    dev: 
        memcached_port: 11212 
    

    然後訪問代碼這個價值,你會說:

    $memcached_port = sfConfig::get('app_memcached_port'); 
    
  2. 通過symfony的情況下手動獲取環境名稱

    $env = sfContext::getInstance()->getConfiguration()->getEnvironment(); 
    if($env == 'dev') { 
        $memcached_port = 11211; 
    } else if($env == 'prod') { 
        $memcached_port = 11212; 
    } 
    

我個人更喜歡選項1,但這完全取決於你如何處理這個。

注意:當我引用環境時,我指的是在index.php文件中定義的symfony環境。

希望這會有所幫助。

相關問題