我在同一台机器上有一个暂存和开发环境。我想根据我的环境在ProjectConfiguration.class.php中配置一个不同的memcached端口。我想在ProjectConfiguration文件中使用$ SERVER ['HTTP_HOST']并不安全,因为这不会考虑从命令行运行的任务。
完成这段代码的最佳方法是什么:
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);
}
答案 0 :(得分:2)
有两种方法可以实现这一目标。
首先,您应该在index.php中单独设置环境。我们通常做的是将其设置为prod,然后检入文件,并在我们的开发服务器和本地机器上手动将其更改为dev,以便更轻松地进行部署。我还建议将此文件放在.gitignore中,以免意外更改。
使用app.yml配置文件。在app.yml配置中,设置一个名为“memcache_port”的密钥,并为每个环境单独设置值。 yaml文件看起来像这样:
prod:
memcached_port: 11211
dev:
memcached_port: 11212
然后在您要说的代码中访问此值:
$memcached_port = sfConfig::get('app_memcached_port');
通过symfony上下文手动获取环境名称
$env = sfContext::getInstance()->getConfiguration()->getEnvironment();
if($env == 'dev') {
$memcached_port = 11211;
} else if($env == 'prod') {
$memcached_port = 11212;
}
我个人更喜欢选项1,但完全由您决定如何处理。
注意:当我引用环境时,我指的是index.php文件中定义的symfony环境。
希望这有帮助。
答案 1 :(得分:1)
我在Web控制器中使用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之外的任何地方。
我的项目配置类包含引用的方法,它可以完成工作:
public function getEnvironment() {
if ($_SERVER ['HTTP_HOST'] == 'dev.example.com') {
return 'dev';
} else {
return 'prod';
}
}
正如您所说,还有一些命令行任务需要考虑 - 但几乎所有symfony任务都将采用--env = xxx参数。我用那些。无论如何,它们都默认为dev,这是我完成大部分工作的地方,所以它不像听起来那么艰巨。
然后我会在你的if语句中使用if (sfConfig::get('sf_environment') == 'dev')
,而不是直接使用HTTP_HOST,它将同时适用于cmd行和web。