7

Ich verwende dotenv für PHP die Umgebungseinstellungen zu verwalten (nicht lavarel aber ich es markiert, weil lavarel auch verwendet dotenv)dotenv erfordert .env Datei auf die Produktion

Ich habe die .env von der Code-Basis ausgeschlossen und ich habe die .env.example für alle anderen Mitarbeiter hinzugefügt

auf der github Seite von dotenv:

phpdotenv für Entwicklungsumgebungen durchgeführt wird, und in der Regel nicht in der Produktion verwendet werden. In der Produktion sollten die tatsächlichen Umgebungsvariablen so festgelegt werden, dass beim Laden der .env-Datei bei jeder Anforderung kein Aufwand entsteht. Dies kann durch einen automatisierten Bereitstellungsprozess mit Tools wie Vagrant, Chef oder Puppet erreicht werden oder manuell mit Cloud-Hosts wie Pagodabox und Heroku eingestellt werden.

Die Sache, die ich nicht verstehe, ist, dass ich die folgende Ausnahme erhalten:

PHP Fatal error: Uncaught exception 'InvalidArgumentException' with message 'Dotenv: Environment file .env not found or not readable.

Dies steht im Widerspruch mit dem, was Dokumentation sagt „die tatsächlichen Umgebungsvariablen gesetzt werden sollten, so dass es keine Overhead des Ladens der .env-Datei bei jeder Anfrage. "

Also die Frage ist, wenn es einen Grund gibt, warum Dotenv diese Ausnahme wirft und/oder fehle ich etwas? Zunächst wird das Verhalten unterscheidet sich im Vergleich zu anderen dotenv Bibliotheken (Rubin)

ich einfach dieses Problem umgehen können, die nicht so schön Lösung:

if(getenv('APPLICATION_ENV') !== 'production') { /* or staging */ 
    $dotenv = new Dotenv\Dotenv(__DIR__); 
    $dotenv->load(); 
} 

Netteste Lösung meiner Meinung nach, aber ich denke, dotenv sollte geh damit um.

$dotenv = new Dotenv\Dotenv(__DIR__); 
//Check if file exists the same way as dotenv does it 
//See classes DotEnv\DotEnv and DotEnv\Loader 
//$filePath = $dotenv->getFilePath(__DIR__); 
//This method is protected so extract code from method (see below) 

$filePath = rtrim(__DIR__, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR . '.env'; 
//both calls are cached so (almost) no performance loss 
if(is_file($filePath) && is_readable($filePath)) { 
    $dotenv->load(); 
} 

Antwort

7

Dotenv wurde um eine Idee herum gebaut, dass es nur in Entwicklungsumgebungen verwendet wird. Daher erwartet es immer .env Datei vorhanden sein.

Die Lösung, die Sie nicht mögen, ist eine empfohlene Methode, Dotenv zu verwenden. Und es scheint, dass es won't change in near future. Verwandte Diskussion in Bugtracker des Projekts: https://github.com/vlucas/phpdotenv/issues/63#issuecomment-74561880

Hinweis, dass Mark offers es ein guter Ansatz für die Produktion/Staging-Umgebungen, die das Laden der Datei überspringt, aber nicht Validierung

$dotenv = new Dotenv\Dotenv(); 
if(getenv('APP_ENV') === 'development') { 
    $dotenv->load(__DIR__); 
} 
$dotenv->required('OTHER_VAR'); 
+0

Aaah Ich kann '$ dotenv-> required()' es funktioniert jede Art und Weise, die nett ist. Die 'getenv ('APP_ENV');' ist sicherer, denke ich? Ich denke, ich gehe für den Filecheck, der für das aktuelle Projekt in Ordnung sein wird. Vielen Dank! –

+0

@SanderVisser was meintest du damit, dass 'getenv ('APP_ENV')' sicherer ist? – Alik

+0

Es verhindert das Laden der .env-Datei in einer Produktionsumgebung, auch wenn sie vorhanden ist. –

0

Wenn Sie Problem haben einen APP_ENV zu erstellen Variable, dieser Code ist einfacher:

$dotenv = new Dotenv\Dotenv(__DIR__); 
if(file_exists(".env")) { 
    $dotenv->load(); 
} 
0

auch in diesen sahen, meine aktuelle Lösung ist Lumen's way zu verwenden (vom 6. Juni 2016), die suggested in a discussion war:

try { 
    (new Dotenv\Dotenv(__DIR__.'/../'))->load(); 
} catch (Dotenv\Exception\InvalidPathException $e) { 
    // 
} 

Sie können bei Bedarf noch weitere Ausnahmebehandlungen vornehmen (z. auf Standardwerte fallen oder eine Validierung durchführen.

+1

Das verhindert den Zweck von "kein Overhead des Ladens der .env-Datei bei jeder Anfrage" –