自动检测内部/外部开发环境

时间:2010-04-09 11:50:57

标签: php development-environment production-environment autodiscovery

我们使用以下函数自动检测我们是在机器内部还是在实时服务器上,然后为各种组件选择适当的配置:

function devIsLocal(){

    $res=false;

    $http_host=$_SERVER['HTTP_HOST'];

    if($http_host=='localhost')$res=true;
    if($http_host=='127.0.0.1')$res=true;
    if(substr($http_host,-4)=='.lan')$res=true;
    if(strpos($http_host, '.')===false)$res=true;

    return($res);

}

正如您所看到的,它只依赖于HTTP_HOST值。

当然,如果您在本地使用某种虚拟主机,例如example.com,那么该功能将被欺骗。

还有其他方法来欺骗这个功能吗?还有哪些其他变量/地方可以用来确定我们的位置?

5 个答案:

答案 0 :(得分:15)

在Apache虚拟主机配置中设置环境变量。这就是Zend Framework的做法。

有关示例,请参阅ZF quick start guide(“创建虚拟主机”部分。)

在httpd.conf或.htaccess文件中,输入:

SetEnv APPLICATION_ENV "development"

然后在您的应用程序中,使用getenv函数获取值:

$environment = getenv("APPLICATION_ENV");
if ($environment == "development")
{
    // do development stuff
}
else if ($environment == "live")
{
    // do live stuff
}

答案 1 :(得分:11)

'127.0.0.1' == $_SERVER["REMOTE_ADDR"]

这永远不会在您的实时系统上评估为TRUE。 :)

答案 2 :(得分:3)

添加到Andy Shellam's answer ..

如果您正在使用mod_vhost_alias,或者具有相同(虚拟)文档根目录的各种域,则可以根据参数设置变量,例如

SetEnvIf SERVER_ADDR x.x.x.x APPLICATION_ENV=development
SetEnvIf HTTP_HOST abc.example.com APPLICATION_ENV=development

答案 3 :(得分:1)

创建并稍后查找仅存在于实时服务器文件系统上的文件。

当然,您的环境应该尽可能相似;我建议的是这样的:在目录/ var / environment /中,有一个名为{devel | test | qa | staging | live}的文件,具体取决于您所在的服务器 - 然后只需检查文件名。 / p>

当然,您需要从版本控制和您可能拥有的任何构建过程中排除此文件。

答案 4 :(得分:0)

  

当然,如果您在本地使用虚拟主机,例如example.com,那么该功能将被欺骗。

此外,如果主机不是本地主机但使用widlcard或默认vhost defn,并且用户在本地将IP地址添加到hosts文件。

我建议在include路径上有一个目录,该路径也存在于实时但不会在那里复制 - 只需存储:

function getEnv(){
  return 'Live';
}

function getEnv(){
  return 'Test';
}

如果两个env都在同一台服务器上 - 您仍然可以通过在Apache config或.htaccess中设置include_path来实现此目的。

这也允许您分离潜在敏感的env特定数据 - 如数据库主机/密码和加密密钥。

下进行。