2008-09-28 6 views
18

Ich möchte automatisch meine Datenbankverbindungseinstellungen auf einer pro-vhost-Basis ändern, so dass ich keinen PHP-Code bearbeiten muss, während der Übergang vom Staging zum Live- und noch zum Zugriff auf verschiedene Datenbanken erfolgt. Dies ist auf einem einzelnen dedizierten Server.PHP-Variablen in httpd.conf einstellen?

So frage ich mich, kann ich eine PHP-Variable oder Konstante in httpd.conf als Teil der vhost-Definition, die die Website dann automatisch auf eine Test-Datenbank verweisen kann setzen?

$database = 'live'; 
if (some staging environment variable is true) { 
    $database = 'testing'; // and not live 
} 

Wenn dies nicht möglich ist, ich denke, in diesem Fall habe ich den Hostnamen sicher untersuchen kann ich sagen, renne, aber ich möchte etwas weniger zerbrechlich

Hope this macht Sinn

vielen dank

Ian

+0

Dies ist keine gute Idee. Zumindest, IMHO. Verwenden Sie Ihre VC, machen Sie ein Tag und bestätigen Sie die notwendigen Änderungen und machen Sie damit fertig. Es wird viel sauberer als eine Art serverseitige Konfiguration sein. – Till

+2

Wir machen zwanzig Veröffentlichungen pro Woche, Till ... Warum schlagen Sie eine gute Idee vor? – Polsonby

+0

Beachten Sie, dass Shell-Skripts, die außerhalb von Apache ausgeführt werden, auch ihre Umgebung kennen müssen. –

Antwort

10

Haben Sie die .htaccess-Datei zu verwenden versucht? Sie könnten die php.ini-Werte damit überschreiben.

Einfach die .htaccess-Datei in das Verzeichnis htdocs:

php_value name value 

Futher Informationen:

+0

Doing dies durch Htaccess klingt wie eine viel bessere Idee als httpd.conf. –

+14

Nicht zustimmen; Es ist besser, dies im vhost-Konfigurationsabschnitt zu tun, da dies bedeutet, dass Sie .htaccess vollständig deaktivieren können, was eine Leistungssteigerung für Apache darstellt, da nicht für jede Anfrage nach einer .htaccess-Datei gesucht werden muss. –

+0

Wenn dies immer noch nicht funktioniert, überprüfen Sie in Ihrer httpd.conf für einen AllowOverride keine Befehl. Habe 45 Minuten damit verbracht, herauszufinden, warum meine .htaccess-Datei gerade ignoriert wurde. –

70

Ja ... Sie können dies tun:

SetEnv DATABASE_NAME testing 

und dann in PHP:

$database = $_SERVER["DATABASE_NAME"]; 

oder

$database = getenv("DATABASE_NAME"); 
+1

Soweit ich weiß, sollte es $ _SERVER ['DATABASE_NAME'] anstelle von $ _ENV sein. Getestet hier auf PHP 5.2 debian und die Vars sind nicht in $ _ENV eingefügt, aber in $ _SERVER – ChrisR

+0

Sieht aus wie du hast Recht. $ _ENV funktioniert in der Befehlszeile, aber es scheint nicht gefüllt zu werden, wenn es unter Apache läuft. –

+6

Das klingt eher nach der Antwort, nach der OP gefragt hat. Die akzeptierte Antwort dient zum Überschreiben von Einstellungen. – RickMeasham

14

Sie können eine Umgebungsvariable gesetzt und empfangen sie mit PHP.

In httpd.conf:

SetEnv database testing 

In Ihrer PHP:

if (getenv('database') == 'testing') { 

oder

if ($_SERVER['database'] == 'testing') { 
3

Ich würde eine Umgebungsvariable nicht gesetzt ist, Dies ist auch in den Standard-Skriptausgaben li sichtbar ke PhpInfo();

verwenden nur php_value in der .htaccess direkt über dem htdocs Ordner und fertig und sicher :)

2

Das Problem mit .htaccess ist, dass es einen Teil der Codebasis Baumes. Und der Code-Basisbaum ist Teil von VC/SVN. Daher wird jede Änderung in local/dev in die Produktion verschoben. Indem Sie die Einstellung env in der httpd.conf beibehalten, ersparen Sie sich die Mühe, nicht versehentlich das Flag "Server vs dev" zu überschreiben. Es sei denn, Sie wollen mit IP-Adresse oder Host-Namen, die beide nicht skalierbare Ansätze sind.

+1

Nicht zu erwähnen, Sie können es auch beim Definieren eines VirtualHost festlegen. – Arda

0

Ich schaute auch auf diese Art von Lösung. Was ich gefunden habe, ist dies, unter Apache können Sie die SetEnv KeyName DataValue in der http.conf verwenden und in IIS können Sie Fast CGI Settings >> Edit ... >> Umgebungsvariablen >> ... und KeyName, DataValue hinzufügen.

Dies wiederum ermöglicht die PHP $var = $_SERVER["KeyName"]; auf die DataValue festgelegt und bei Bedarf sowohl unter IIS als auch Apache konsistent verwendet werden.

Ich weiß, das ist ein seltsamer Anwendungsfall. Ich benutze WAMP bei der Arbeit und MAMP zu Hause, so dass es schön ist, auf die gleiche Weise arbeiten zu können.