ThinkPHP 5.1 多环境变量配置支持

https://www.kancloud.cn/manual/thinkphp6_0/1037484

tp6是支持多环境变量配置支持的,但Tp5不支持。之前的做法是在代码push上去的时候,通过钩子去执行写好的shell脚本,在拉取最新代码的同时,执行下shell脚本来拷贝不同目录下的.env文件来覆盖根目录的.env文件。

这样的方式能够解决不同的分支使用不同的.env文件的问题,但存在一个问题,那就是在覆盖过程中请求接口的时候会短暂出现报错的情况,问题倒也不是很大,但是作为强迫症的我总在想有没有更好的解决方案。终于在某一天我想到了,既然Tp6可以读取不同的文件,我为什么不是重写下Tp5读取配置的地方呢,咱说干就干。

在/thinkphp/library/think/App.php 该文件的第182行位置,就是加载.evn文件的代码。既然找到了加载的地方那么我们就从这里入手去修改它。我们的目的是根据不同的分支去加载不同的文件,那么第一步要解决的就是获取当前分支。咱不废话了,直接上代码

env文件配置如下图所示,当然也可以根据自己的需要去创建不同的文件。

“`

//获取当前分支
$head = @file_get_contents($this->rootPath . '/.git/HEAD');
if ($head)
{
    $head = trim($head);
    $i = strripos($head, '/');

    $branch = substr($head, $i + 1);

    if ($branch == "dev"){
        if (is_file($this->rootPath . 'dev.env')) {
            $this->env->load($this->rootPath . 'dev.env');
        }
    }elseif ($branch == "master"){
        if (is_file($this->rootPath . 'master.env')) {
            $this->env->load($this->rootPath . 'master.env');
        }
    }elseif (is_file($this->rootPath . '.env')) {
        $this->env->load($this->rootPath . '.env');
    }
}else{
    // 加载环境变量配置文件
    if (is_file($this->rootPath . '.env')) {
        $this->env->load($this->rootPath . '.env');
    }
}
```