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 部署,是一样的。
3252 3 10
3个评论

askuiop

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

今天不抽烟

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

  • 暂无评论
lsmir2

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

  • 暂无评论
x
 
1
  • |
  • |
  • |

Caesar-Tang

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