最近在使用Lumen框架部署上线时遇到的一个问题

Lumen / Laravel 中的.env文件里一般配置着各种环境所对应的配置,例如:db,cache等配置,官方的推荐是版本库中保留一个.env.example,各个环境cp .env.example的配置并配上对应环境的配置生成.env文件,完成项目的部署。

但实际应用中会遇到一个比较尴尬的问题是:如果新增或修改了配置,需要手动到对应环境上去改配置,一般的测试或者开发环境还好,但是对应线上生产或者预发布环境,一般是不允许手动修改文件的。而且也有可能线上的机器较多,手动一个个去操作不方便也不安全。而且像现在一般也都是使用自动化上线工具,拉版本库代码直接上线,此时官方推荐的做法就不是很适用了。

既然满足不了自己的需求,那就稍微改造一下吧。 初步的思路是: 把各个环境的配置文件都放到版本库里,然后代码里判断出各个环境,加载对应的环境配置。

首先我们来看看lumen是如何运行的,通过分析lumen的入口文件LUMEN/public/idnex.php,我们看到它引用了 LUMEN/bootstrap/app.php 这个文件。 lumen-index

然后在LUMEN/bootstrap/app.php中,完成了Dotenv类的初始化 lumen-bootstrap-app

通过查看Dotenv类的源码,我们可以知道构造函数的俩个参数的含义

  1. .env文件所在的目录
  2. 文件名

lumen-phpdotenv

了解了如上的信息后,我们就可以开始自己的改动啦。 首先在版本库里新建

  • .env.local
  • .env.test
  • .env.production

lumen-bootstrap-app-new

通过获得服务器的hostname来得到对应的环境,然后load对应的.env文件就好了。


参考