2010-03-02 19 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环境。

希望这会有所帮助。

相关问题