Zend框架自动切换生产、暂存、测试等环境

6

如何切换生产环境和测试环境,需要在哪里进行修改?使用Bootstrap吗?

还想知道是否有人已经配置了他们的Zend框架,根据主机信息自动切换生产、测试、预发布等环境。

例如..

 if (hostname = 'prodServer') ... blah
 if (hostname = 'testServer') ... blah

我对Zend不熟悉,但通常会根据主机信息自动切换运行环境来配置我的项目。

谢谢。

4个回答

16

假设你正在使用Zend_Application中的APPLICATION_ENV,那么你可以在你的.htaccess或主要的Apache配置文件中添加这个(假设正在使用Apache - 在不同的Web服务器上也应该仍然可行)。

例如,在你的.htaccess/config中(假设启用了mod_setenv):

SetEnvIf HTTP_HOST abc.example.com APPLICATION_ENV=production
SetEnvIf HTTP_HOST def.example.com APPLICATION_ENV=staging 
SetEnvIf HTTP_HOST ghi.example.com APPLICATION_ENV=development

然后通过以下方式确保在index.php中设置了APPLICATION_ENV:

// Define application environment
defined('APPLICATION_ENV') || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));

如果您使用Zend_Tool生成项目,则会添加此内容。


SetEnvIf Host def.example.com APPLICATION_ENV=staging 对我有效。 - Yeroon
更好的方法似乎是: SetEnvIf HOST ^abc.example.com$ APPLICATION_ENV=production - Kamil

4

以下是我在 .htaccess 中使用的方法

SetEnvIf Host dev.mydomain.ca APPLICATION_ENV=development
SetEnvIf Host mydomain.ca APPLICATION_ENV=production
SetEnvIf Host mydomain.localhost APPLICATION_ENV=production

接下来在我的application.ini文件中

[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1
; Database for development 
resources.db.params.dbname = "mydabase-dev"

1
我们定义了一个环境变量(ENVPHP),并在XML配置文件中使用它,只要您定义了正确的ENVPHP环境变量,就会加载正确的DB参数。使用XML,您可以将通用参数扩展(或覆盖)为特定环境的参数。
例如,配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<application>
    <common>
        <name>MyApp_name</name>
        <code>MyApp_code</code>
        <version>MyApp_version</version>
        <authentication>
            ... authentication specific parameters (ie. LDAP connection parameters)
        </authentication>
        ...
    </common>
    <dev extends="common">
        <database>
            ... DB connection parameters for development
        </database>
        ...
    </dev>
    <tst extends="common">
        <database>
            ... DB connection parameters for test
        </database>
        ...
    </tst>
    <prd extends="common">
        <database>
            ... DB connection parameters for production
        </database>
        ...
    </prd>
</application>

为了加载配置,我在我的引导程序中(实际上是在一个应用程序单例类中)有以下内容:

public static function getEnv()
{
    if (self::$env === null) {
        self::$env = getenv('ENVPHP');
    } else {
        return self::$env;
    }
}

protected function initConfig ()
{
    $configFile = $this->appDir . '/config/application.xml';
    if (! is_readable($configFile)) {
        throw new Application_Exception('Config file "' . $configFile . '" is not readable');
    }
    if (false === self::getEnv()) {
        throw new Application_Exception('The environment variable "ENVPHP" is not defined');
    }
    $config = new Zend_Config_Xml($configFile, self::getEnv(), true);
    $config->setReadOnly();

    Zend_Registry::set('config', $config);
    $this->config = $config;
}

在 PHP 代码中,如果我想针对特定环境执行某些操作,那么我会使用 Application::getEnv() 来检查当前所处的环境,并根据其执行相应的代码。
顺便提一下,ENVPHP 环境变量可以在你的 Apache 配置文件中设置,例如在 VirtualHost 容器中使用 SetEnv ENVPHP "dev"。对于 CLI PHP 脚本,你应该将其设置为操作系统环境变量...

0

我看到的最好的方法是:

index.php - production
index_dev.php - dev, index_dev.php/controller/action

我也尝试了以主机命名的配置文件:

base.ini - base config
localhost.ini - dev config
prod.host.com.ini - prod config

但第一种方法要好得多。


2
我真的看不出单独的索引文件有什么价值,更别说把它视为最佳方式了。理想情况下,环境应该改变(即硬件/服务器),而从开发->测试->暂存->生产时代码应该完全相同。环境之间的真正区别在于受众(因此调试/日志活动的级别也不同)。因此,在.htaccess(或虚拟主机配置)中设置SetEnv应该定义您所在的领域,一旦您有了领域/环境-您就可以从单个 ini文件中加载相应的部分。 - Victor Farazdagi
无论您在哪里定义它,优势是能够快速切换生产/开发环境。 - Vladimir Mihailenco
区别在于,在一种情况下,您在服务器上定义环境,在另一种情况下,客户端将选择环境。这有几个缺点:安全性,如果您部署了index_dev.php。维护:您在代码中有两个或多个定义env的点(config、index_<env>.php、api_<env>.php、cli_<api>.php等);您必须告诉您的客户(AJAX、WebService-Clients、Shell-Scrips等),为不同的环境访问不同的文件/URI,您甚至必须告诉您的客户,您希望客户端请求哪个环境。 - stofl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接