2010-03-24 8 views
6

Was ändere ich, um von Produktion zu Staging .. etc .. und wo Bootstrap?Zend Framework Auto-Switch Produktion Staging-Test .. usw.

Auch neugierig, wenn jemand konfiguriert ihren Zend Framework automatisch von Produktion zu wechseln, Staging, Test .. etc basierend auf Host-Informationen ..

Beispiel ..

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

Ich bin Neu bei Zend, aber normalerweise konfiguriere ich meine Projekte so, dass sie automatisch Laufumgebungen basierend auf den Host-Informationen wechseln.

dank

Antwort

15

Angenommen, Sie verwenden APPLICATION_ENV als Teil von Zend_Application, dann können Sie dies entweder in Ihrer .htaccess- oder Haupt-Apache-Konfiguration hinzufügen (vorausgesetzt, Apache wird verwendet - sollte auch mit anderen Webservern möglich sein).

Zum Beispiel in der .htaccess/config (übernimmt 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 

dann sicher, dass APPLICATION_ENV in index.php gesetzt wird unter Verwendung:

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

Dies wird ergänzt durch Zend_Tool wenn Sie es verwenden, um das Projekt zu generieren.

+0

SetEnvIf Host def.example.com APPLICATION_ENV = Staging funktioniert für mich – Yeroon

+0

besser scheint zu sein: SetEnvIf HOST^abc.example.com $ APPLICATION_ENV = Produktion ... – Kamil

0

Der beste Weg, die ich sah, ist:

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

I Host namens configs Dateien auch versucht:

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

aber der erste Ansatz ist viel besser.

+2

Ich sehe ehrlich gesagt keinen Wert in separaten Index-Dateien, geschweige denn, es als den besten Weg zu sehen. Idealerweise sollte sich die Umgebung ändern (das ist Hardware/Server), während der Code beim Wechsel von dev-> testing-> staging-> production gleich sein sollte. Der wirkliche Unterschied zwischen den Umgebungen ist die Zielgruppe (und damit auch die Debug-Aktivität). Daher sollte SetEnv in .htaccess (oder virtuelle Host-Konfiguration) definieren, in welchem ​​Bereich Sie sich befinden, und sobald Sie einen Bereich/Umgebung haben - laden Sie den entsprechenden Abschnitt aus Ihrer * einzigen * ini-Datei. –

+0

Es gibt keinen Unterschied, wo Sie es definieren, der Vorteil ist schnell wechseln prod/dev Umgebung. –

+0

Der Unterschied besteht darin, dass im einen Fall die Umgebung im Server definiert wird und im anderen Fall der Client die Umgebung auswählt. Dies hat mehrere Nachteile: Sicherheit, wenn Sie eine index_dev.php bereitstellen. Wartung: Sie haben zwei oder mehr Punkte im Code, wo Ihr env definiert ist (config, index_ .php, api_ .php, cli_ .php, ...); Sie müssen Ihren Clients (AJAX, WebService-Clients, Shell-Scripts, ...) mitteilen, dass sie auf verschiedene Dateien/URIs für verschiedene Umgebungen zugreifen können. Sie müssen Ihren Clients sogar mitteilen, welche Umgebung "Sie" vom Client angefordert werden soll . – stofl

1

Wir definieren eine Umgebungsvariable (ENVPHP) und verwenden diese in unseren XML-Konfigurationsdateien, so dass die korrekten DB-Parameter geladen werden, solange Sie die richtige ENVPHP-Umgebungsvariable definieren. Mit XML können Sie Ihre allgemeinen Parameter mit denen für die spezifischen Umgebungen erweitern (oder überschreiben).

dh. die folgenden in meinem Bootstrap (na ja, eigentlich in einer Anwendung Singletonklasse)

<?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> 

und die Konfiguration zu laden, ich habe:

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; 
} 

In PHP-Code, wenn ich möchte, dass die Konfiguration sieht wie folgt aus Um einige Dinge nur für bestimmte Umgebungen zu tun, verwende ich Application :: getEnv(), um zu überprüfen, in welcher Umgebung ich bin, und den entsprechenden Code auszuführen.

BTW Die Umgebungsvariable ENVPHP kann in Ihrer Apache-Konfigurationsdatei mit ie festgelegt werden. SetEnv ENVPHP "dev" in Ihrem VirtualHost-Container.

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

Dann in meiner Anwendung in .htaccess für CLI PHP-Skripte sollten Sie es als OS-Umgebungsvariable ...

4

die für mich arbeiten.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"