webman 使启动命令支持启用不同环境

Caesar-Tang

webman 通过启动命令启用开发或生产环境

很多时候,我们都会把关键信息放在一处进行配置,如:通过 .env 来配置 app_debug 开关或数据库信息等,方便管理及部署。
我们通常有两种或多种环境用于开发或生产,并在部署时使用对应的配置文件。
但如果我们只用一个配置文件,并期望在启动命令中通过输入参数的方式,来决定启用开发还是正式环境,该如何处理呢?下面给大家分享下自己的方法,仅供参考。

一. 方案优势

1. 方便 在一个配置中使用多个环境
2. 方便 在启动时启用某个环境
3. 同样适用于 docker 和 supervisor 部署

二. 方案劣势

1. 需要修改框架的原始文件(start.php)
2. 不适用于 windows 上的 php windows.php 命令

三. 解决方案

1. 安装 Env 环境变量组件
composer require vlucas/phpdotenv
2. 项目根目录新建.env文件,并增加你的配置,如:

截图

3. 修改配置处的引用,注意某些区别环境的配置,如:

服务配置:
截图
应用配置:
截图

4. 修改框架的原始文件(start.php),将命令行中的变量写入环境变量:
// 解析命令行启动参数
foreach ($argv as $key=>$value) {
    // 写入环境变量
    if( $value==='-e' && array_key_exists(($key+1), $argv) && str_contains($argv[($key+1)], '=') ) {
        putenv($argv[($key+1)]);
    }
}

截图

5. 修改框架的原始文件(windows.php),将命令行中的变量写入环境变量:
// 解析命令行启动参数
foreach ($argv as $key=>$value) {
    // 写入环境变量
    if( $value==='-e' && array_key_exists(($key+1), $argv) && str_contains($argv[($key+1)], '=') ) {
        putenv($argv[($key+1)]);
    }
}

截图

6.通过 -e 命令来启用开发或正式环境:
测试:php start.php start -e APP_ENV=DEV
正式:php start.php start -e APP_ENV=PROD

截图
截图

四. 总结

流程上大致以下步骤:
1. 通过 .evn 的 APP_ENV 来区别开发环境
2. 在框架的 start.php 及 windows.php 中,获取命令行上的 -e 参数并写入环境变量
3. 写入的环境变量,会覆盖掉 .env 中的配置
实际上,通过该方式,可以覆盖 .env 中的所有配置。该方案在 windows 及 linux 均已测试。使用 docker 还是 supervisor 部署,是一样的。
2584 3 10
3个评论

askuiop

好像运行 composer update , 就会重新生成 start.php , 之前的修改就会丢失, 怎么办 ?

今天不抽烟

app.debug 设置为 getenv(getenv('APP_ENV') . '_APP_DEBUG')
读取的值不生效

  • 暂无评论
lsmir2

可以不用写在start.php 文件 可以写在 config/server.php 文件 写个初始化接口 放在server.php里加载即可

  • 暂无评论

Caesar-Tang

770
积分
0
获赞数
0
粉丝数
2022-03-28 加入
×
🔝