手撕 Env类. 从启动参数,或从.env文件指定配置文件

lsmir2

使用之式

1.环境变量 (优先)

php start.php start -e  APP_ENV=development

2.在.env文件中写入

WENMAN_ENV=development

找一个僻静角落,轻轻放入.

<?php
namespace app\common;
class Env
{
    public static function init(): void
    {
        global $argv;
        $env = '';
        //从环境变量获取 APP_ENV
        foreach ($argv as $key => $value) {
            if ($value == '-e' && array_key_exists($key + 1, $argv) && str_contains($argv[$key + 1], '=')) {
                list($name, $value) = explode('=', $argv[$key + 1]); //  $argv[$key + 1] = "APP_ENV=DEV" key value
                if ($name == 'APP_ENV' && file_exists(base_path() . '/.env.' . $value)) {
                    $env = parse_ini_file(base_path() . '/.env.' . $value);
                }
            }
        }

        //从.env 文件获取  WENMAN_ENV=development   env文件全名 .env.development
        if (empty($env) && file_exists(base_path() . '/.env')) {
            $env = parse_ini_file(base_path() . '/.env', true);
            if (isset($env['WENMAN_ENV'])) {
                $env = parse_ini_file(base_path() . '/.env.' . $env['WENMAN_ENV'], true);
            }
        }
        //初始化ENV 配置
        if (is_array($env)) {
            foreach ($env as $key => $val) {
                //过滤首字母#或者'//'开头的注释
                if (str_starts_with($val, '#') || str_starts_with($val, '//')) continue;
                if (is_array($val)) {
                    foreach ($val as $k => $v) { //如果是二维数组 item = PHP_KEY_KEY
                        $item = $key . '_' . $k;
                        putenv("$item=$v");
                    }
                } else {
                    putenv("$key=$val");
                }
            }
        }
    }
}

掰开 config/server.php
在return 之前加入一行

\app\common\Env::init();
return [....];

使用 getenv获取环境变量
或者封装一个助手函数

function envs($key, $default = null): string|array|null
{
    $value = getenv($key, true);
    if ($value === false) return $default;
    return $value;
}
335 0 1
0个评论

lsmir2

710
积分
0
获赞数
0
粉丝数
2024-01-29 加入
×
🔝