Laravel之开发测试和生产环境区分

不做动机揣测,少做价值判断

Laravel环境检测的方法是很容易的,因为大家都知道Laravel中使用了Dotenv来做文件配置,这就牵扯到了我们的都很熟悉的.env。

比如一个典型的.env是:

1
2
3
4
5
6
7
8
9
10
11
12
APP_ENV=local
APP_DEBUG=true
APP_KEY=base64:3csTuw5O1me1PF4j9xErbUR+seyH1xdf6uRfvjuQ22Q=
APP_URL=http://localhost

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=db_name
DB_USERNAME=db_user
DB_PASSWORD=db_pass
//...省略

今天我的这篇分享主要介绍两种区分不同环境的方法。

不同环境维护自己的.env文件

这种办法也是Laravel默认的办法,也就是开发环境、测试环境和生产环境各自维护自己的.env文件,也就是说.env不要加到版本控制系统中,通过不同的配置可以做到环境的区分,比如:

开发环境

1
2
APP_ENV=dev
//...省略

测试环境

1
2
APP_ENV=staging
//...省略

生产环境

1
2
APP_ENV=production
//...省略

这样,在我们的代码中即可以通过判断APP_ENV来判断是哪种环境。但是这种办法我个人是不太喜欢的,原因有以下几点:

  • 环境的判断过多的写到代码里面,维护起来很麻烦
  • 如果某次上线需要修改配置文件,则每次上线代码还需要到线上机器修改.env文件,部署起来很麻烦

不同环境加载自己的.env.文件

这里面的.env.文件延伸开来就是.env.dev、.env.test和.env.prod,比如开发环境会自动加载.env.dev,依此类推,那么如果是这样的话,不同环境的机器又怎么知道加载哪个文件呢?其实这里面还是耍了点小聪明,别忘了我们有php.ini

  • 1.在php.ini中追加一行配置
    当然开发、测试和生产环境中env所对应的值也需要不一样
    1
    2
    3
    4
    5
    6
    //开发环境
    env=dev
    //测试环境
    env=staging
    //生产环境
    env=production
  • 2.加载不同的配置文件
    在bootstrap/app.php文件中添加如下判断,在这里将通过获取php.ini中的env的值,然后从而加载不同的配置文件。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //...省略
    $env = get_cfg_var('env');
    $env = !empty($env) ? $env : 'production';
    if(!defined('APP_MODE')){
    define('APP_MODE', $env);
    }
    $app->loadEnvironmentFrom('.env.'.$env);

    return $app;
  • 3.新建.env.dev、.env.staging和.env.production

好,就到此为止了,当然虽然我非常喜欢第二种办法,但第二种毕竟需要对线上机器做一次大的改动,需要运维同学支持下。但是也需要具体情况具体来选择吧。

http://xuwenzhi.com/2016/07/31/laravel%E4%B9%8B%E5%BC%80%E5%8F%91%E3%80%81%E6%B5%8B%E8%AF%95%E5%92%8C%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E5%8C%BA%E5%88%86/