很多时候,我们都会把关键信息放在一处进行配置,如:通过 .env 来配置 app_debug 开关或数据库信息等,方便管理及部署。
我们通常有两种或多种环境用于开发或生产,并在部署时使用对应的配置文件。
但如果我们只用一个配置文件,并期望在启动命令中通过输入参数的方式,来决定启用开发还是正式环境,该如何处理呢?下面给大家分享下自己的方法,仅供参考。
1. 方便 在一个配置中使用多个环境
2. 方便 在启动时启用某个环境
3. 同样适用于 docker 和 supervisor 部署
1. 需要修改框架的原始文件(start.php)
2. 不适用于 windows 上的 php windows.php 命令
composer require vlucas/phpdotenv
服务配置:
应用配置:
// 解析命令行启动参数
foreach ($argv as $key=>$value) {
// 写入环境变量
if( $value==='-e' && array_key_exists(($key+1), $argv) && str_contains($argv[($key+1)], '=') ) {
putenv($argv[($key+1)]);
}
}
// 解析命令行启动参数
foreach ($argv as $key=>$value) {
// 写入环境变量
if( $value==='-e' && array_key_exists(($key+1), $argv) && str_contains($argv[($key+1)], '=') ) {
putenv($argv[($key+1)]);
}
}
测试: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 部署,是一样的。
好像运行 composer update , 就会重新生成 start.php , 之前的修改就会丢失, 怎么办 ?
执行 composer update,会更新框架及所有的包,这种情况下,只能再重写 start.php 了。另外,为了避免不必要的风险,建议尽量限制版本约束,以避免意外更新到不兼容的版本。
用官方的方法 https://www.workerman.net/doc/webman/components/env.html
用git 先提交.
composer update
git restore .
app.debug 设置为 getenv(getenv('APP_ENV') . '_APP_DEBUG')
读取的值不生效
可以不用写在start.php 文件 可以写在 config/server.php 文件 写个初始化接口 放在server.php里加载即可