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 于 6年前 加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 21
Destiny

:+1:

6年前 评论

降龙十八赞~~~

6年前 评论

那怎么判断当前 APP_ENV 是需要 development staging production 想看看大神的代码实现呢

6年前 评论

@韦林

  1. 你是说怎么把APP_ENV=development,APP_ENV=staging,APP_ENV=production分别放在对应环境的系统变量里,还是说laravel为什么在不同环境能够读取.env.xxx文件?

  2. 不需要写任何代码啊,项目根目录下分别版本控制几个.env.xxx文件就行,不同环境服务器设置系统变量APP_ENV=xxx,查看系统变量设置是否OK用phpinfo()查看就行。
6年前 评论

@韦林 比如说你本地机子环境是APP_ENV=local,通过phpinfo()查看下,那就会读取你项目根目录的.env.local文件,你可以测试测试dd(env('DB_PASSWORD')), DB_PASSWORD是你本地的.env.local文件里的key。

6年前 评论

@lx1036 谢谢秒回,正在尝试学习中!!!

6年前 评论

@lx1036 我其实想说 他不是通过APP_ENV 来知道你是什么环境吗 那APP_ENV 这个常量是会在哪里定义它呢???

6年前 评论

@韦林 ubuntu可以在/etc/environment里定义。本地如果用的是zsh shell,就可以在~/.zshrc里定义APP_ENV=testingbash shell就在~/.bash_profile里定义。。
顺便说一句,推荐下zsh shell,还挺漂亮。http://ohmyz.sh/

6年前 评论

@lx1036 谢谢 我的mac 用就是 ohmyz 和 homestead 的集成开发环境

6年前 评论

那项目服务器掌握在运维人员手里的话,我们还要通知他们修改一下所有机器的环境变量。感觉有点麻烦。

6年前 评论

@keer 你们那边针对不同环境.env是怎么做的呢?

6年前 评论

但是把生产环境的env也放进代码库,这样不安全吧?

6年前 评论

@李书德 我也有这个疑问,.env.xxx 作为正式的配置,要放版本库吗?

6年前 评论

@纸牌屋弗兰克 env文件我是添加到gitignore里面的,没有.env.production那些,版本库里面就一个.env.example,部署到服务器由运维更改内容和名称,其他人在自己的机子上自己更改。

6年前 评论

@李书德 @纸牌屋弗兰克 代码仓库都放在私有的gitlab/github/bitbucket上,没有啥不安全的。。能自动化的就没必要手动操作,浪费时间么。。

6年前 评论

@lx1036 但是所有的开发都看到了呀

6年前 评论

我之前是用getEnv('APP_ENV')来获取当前服务器运行环境,然后用Dotenv::load()来加载对应的.env文件。看详哥的文章总是让我想起以前,真怀念啊哈哈。

@李书德 所有开发都看到,这在整个项目都是自动化(包括服务器启动、环境配置和代码的自动部署)的前提下本身不是大的问题(自动化程度优于其它),亚马逊的EC2VPCS3RDS等云服务上做隔离,意味着开发人员拿到配置也是无法拿到(或破坏)相应数据的。

另外说一句,详哥所在的公司在用户敏感数据的安全上的处理也是很高级别的:100:

6年前 评论
颜⑧

5.1 如何使用?

6年前 评论

@颜⑧ 5.1要么升级,要么就按照@杨进春 春哥说的Donenv::load()就行。。

6年前 评论

Commands 里面怎么读

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!