我已从代码库中排除了.env,并为所有其他协作者添加了.env.example
在dotenv的github页面上:
PHPdotenv is made for development environments,and generally should not be used in production. In production,the actual environment variables should be set so that there is no overhead of loading the .env file on each request. This can be achieved via an automated deployment process with tools like Vagrant,chef,or Puppet,or can be set manually with cloud hosts like PagodaBox and Heroku.
我不明白的是我得到以下异常:
PHP致命错误:未捕获异常’InvalidArgumentException’,消息’Dotenv:环境文件.env未找到或无法读取.
这与文档说“应该设置实际环境变量以便在每个请求上加载.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(); }
您不喜欢的解决方案是使用Dotenv的推荐方法.似乎是won’t change in near future.项目问题跟踪器中的相关讨论:https://github.com/vlucas/phpdotenv/issues/63#issuecomment-74561880
请注意,Mark offers有一个很好的生产/登台环境方法,它可以跳过文件加载,但不会验证
$dotenv = new Dotenv\Dotenv(); if(getenv('APP_ENV') === 'development') { $dotenv->load(__DIR__); } $dotenv->required('OTHER_VAR');