Laravel5.4 不同环境下 env 文件设置
Laravel5.4现在支持不同环境下env
文件设置(好像是L5.4最新支持的吧,记不清楚了,也有可能L5.2-5.3就已经支持了),可以针对不同环境(development, staging, production)设置env文件为:
development: .env.development
staging: .env.staging
production: .env.production
根据不同环境服务器设置系统变量(可根据phpinfo()
查看APP_ENV
环境变量是否OK):
development: APP_ENV=development
staging: APP_ENV=staging
production: APP_ENV=production
这样,项目根目录下就会有根据不同环境对应的.env.xxx
文件,放入版本控制,本地的环境对应.env
不需要放入版本控制。
原理可看laravel的源码:
namespace Illuminate\Foundation\Bootstrap;
use Dotenv\Dotenv;
use Dotenv\Exception\InvalidPathException;
use Symfony\Component\Console\Input\ArgvInput;
use Illuminate\Contracts\Foundation\Application;
class LoadEnvironmentVariables
{
/**
* Bootstrap the given application.
*
* @param \Illuminate\Contracts\Foundation\Application $app
* @return void
*/
public function bootstrap(Application $app)
{
if ($app->configurationIsCached()) {
return;
}
$this->checkForSpecificEnvironmentFile($app);
try {
(new Dotenv($app->environmentPath(), $app->environmentFile()))->load();
} catch (InvalidPathException $e) {
//
}
}
/**
* Detect if a custom environment file matching the APP_ENV exists.
*
* @param \Illuminate\Contracts\Foundation\Application $app
* @return void
*/
protected function checkForSpecificEnvironmentFile($app)
{
if (php_sapi_name() == 'cli' && with($input = new ArgvInput)->hasParameterOption('--env')) {
$this->setEnvironmentFilePath(
$app, $app->environmentFile().'.'.$input->getParameterOption('--env')
);
}
if (! env('APP_ENV')) {
return;
}
$this->setEnvironmentFilePath(
$app, $app->environmentFile().'.'.env('APP_ENV')
);
}
2019-02-19 更新
APP_ENV
可在 etc/nginx/fastcgi.conf
中设置就行,这样 nginx 会把这些常量传给 PHP 作为环境变量:
.
.
.
fastcgi_param APP_ENV staging;
本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由 Summer
于 7年前 加精
:+1:
降龙十八赞~~~
那怎么判断当前 APP_ENV 是需要 development staging production 想看看大神的代码实现呢
@韦林
你是说怎么把
APP_ENV=development,APP_ENV=staging,APP_ENV=production
分别放在对应环境的系统变量里,还是说laravel为什么在不同环境能够读取.env.xxx
文件?.env.xxx
文件就行,不同环境服务器设置系统变量APP_ENV=xxx
,查看系统变量设置是否OK用phpinfo()
查看就行。@韦林 比如说你本地机子环境是
APP_ENV=local,通过phpinfo()查看下
,那就会读取你项目根目录的.env.local
文件,你可以测试测试dd(env('DB_PASSWORD')), DB_PASSWORD是你本地的.env.local文件里的key。
@lx1036 谢谢秒回,正在尝试学习中!!!
@lx1036 我其实想说 他不是通过APP_ENV 来知道你是什么环境吗 那APP_ENV 这个常量是会在哪里定义它呢???
@韦林 ubuntu可以在
/etc/environment
里定义。本地如果用的是zsh shell
,就可以在~/.zshrc
里定义APP_ENV=testing
,bash shell
就在~/.bash_profile
里定义。。顺便说一句,推荐下
zsh shell
,还挺漂亮。http://ohmyz.sh/@lx1036 谢谢 我的mac 用就是 ohmyz 和 homestead 的集成开发环境
那项目服务器掌握在运维人员手里的话,我们还要通知他们修改一下所有机器的环境变量。感觉有点麻烦。
@keer 你们那边针对不同环境
.env
是怎么做的呢?但是把生产环境的env也放进代码库,这样不安全吧?
@李书德 我也有这个疑问,.env.xxx 作为正式的配置,要放版本库吗?
@纸牌屋弗兰克 env文件我是添加到gitignore里面的,没有.env.production那些,版本库里面就一个.env.example,部署到服务器由运维更改内容和名称,其他人在自己的机子上自己更改。
@李书德 @纸牌屋弗兰克 代码仓库都放在私有的
gitlab/github/bitbucket上
,没有啥不安全的。。能自动化的就没必要手动操作,浪费时间么。。@lx1036 但是所有的开发都看到了呀
我之前是用
getEnv('APP_ENV')
来获取当前服务器运行环境,然后用Dotenv::load()
来加载对应的.env
文件。看详哥的文章总是让我想起以前,真怀念啊哈哈。@李书德 所有开发都看到,这在整个项目都是自动化(包括服务器启动、环境配置和代码的自动部署)的前提下本身不是大的问题(自动化程度优于其它),亚马逊的
EC2
、VPC
、S3
、RDS
等云服务上做隔离,意味着开发人员拿到配置也是无法拿到(或破坏)相应数据的。另外说一句,详哥所在的公司在用户敏感数据的安全上的处理也是很高级别的:100:
5.1 如何使用?
:thumbsup:
@颜⑧ 5.1要么升级,要么就按照@杨进春 春哥说的
Donenv::load()
就行。。Commands 里面怎么读