web-dev-qa-db-ja.com

dotenvは本番環境で.envファイルを必要とします

PHPにdotenvを使用して環境設定を管理しています(lavarelではありませんが、lavarelもdotenvを使用しているため、タグを付けました)

コードベースから.envを除外し、他のすべての共同編集者に.env.exampleを追加しました

Dotenvのgithubページ:

phpdotenvは開発環境用に作成されており、通常、本番環境では使用しないでください。本番環境では、実際の環境変数を設定して、各リクエストで.envファイルをロードするオーバーヘッドがないようにする必要があります。これは、Vagrant、chef、Puppetなどのツールを使用した自動デプロイメントプロセスで実現するか、PagodaboxやHerokuなどのクラウドホストで手動で設定できます。

私が理解していないことは、次の例外が発生することです。

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

これは、「各リクエストで.envファイルをロードするオーバーヘッドがないように実際の環境変数を設定する必要がある」というドキュメントに矛盾します。

問題は、dotenvがその例外をスローする理由があるかどうか、および/または何か不足しているのかどうかです。まず、他のdotenvライブラリ(Ruby)と比較して動作が異なります。

私はこれを簡単に回避できますが、それほど良い解決策ではありません:

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

私の意見では最も良い解決策ですが、dotenvはこれを処理する必要があると思います。

$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();
}
10
Sander Visser

Dotenvは、開発環境でのみ使用されるという考えに基づいて構築されました。したがって、常に.env存在するファイル。

あなたが気に入らなかった解決策は、Dotenvを使用するための推奨される方法です。そして、それは 近い将来変更されない のようです。プロジェクトの課題追跡での関連ディスカッション: https://github.com/vlucas/phpdotenv/issues/63#issuecomment-7456188

Mark offers は、ファイルの読み込みをスキップするが検証は行わない、本番環境/ステージング環境に適したアプローチがあることに注意してください。

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

APP_ENV変数の作成に問題がある場合、このコードは簡単です。

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

これについても調べましたが、現在の解決策は ルーメンの方法 (2016年6月6日現在)を使用することです ディスカッションで提案

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

必要に応じて、追加の例外処理を行うこともできます(たとえば、デフォルト値に下げるか、検証を行います)。

1
Oliver Adria