【thinkphp】一个自用的.env环境变量动态配置php函数

沉梦小哥哥
预计阅读时长 33 分钟
位置: 首页 php杂谈 正文

由于各种问题,动态配置环境变量不一定好使,于是写了个~

    /**
     * 动态配置.env环境变量
     *
     * @param string $key 变量名 支持组
     * @param string $value 变量值
     * @return void
     */
    public function setEnv(string $key = '', string $value = '') {
        $file = root_path() . '.env';
        $data = '';
        if (is_file($file)) {
            $data = trim(file_get_contents($file));
        }

        if ($data == '') {
            // 没有内容就直接创建
            $data = <<<Env
           APP_DEBUG = false

           [APP]
           DEFAULT_TIMEZONE = Asia/Shanghai

           [DATABASE]
           TYPE = mysql
           HOSTNAME =
           HOSTPORT = 3306
           USERNAME =
           PASSWORD =
           DATABASE =
           PREFIX = 
           CHARSET = utf8
           DEBUG = true

           [LANG]
           default_lang = zh-cn

           [REDIS]
           REDIS_HOSTNAME =
           PORT = 6379
           REDIS_PASSWORD =
           SELECT = 0

           [QUEUE]
           QUEUE_NAME =
Env;
        }

        // 修改配置
        $key = strtoupper($key);
        if (strpos($key, '.')) {
            $arr   = explode('.', $key, 2);
            $key1  = $arr[0];
            $key2  = $arr[1];
            $start = mb_strpos($data, '[' . $key1 . ']');
            if ($start !== false) {
                // 找到配置组
                $str_up    = mb_substr($data, 0, $start);
                $str_lower = mb_substr($data, $start);
                if (preg_match('/' . $key2 . '  =/', $str_lower)) {
                    // 找到就直接替换
                    $str_lower = preg_replace('/(\n' . $key2 . '  =(.*)|\n' . $key2 . '  =)/', "\n" . $key2 . '  =  ' . $value, $str_lower);
                    $data      = $str_up . $str_lower;
                } else {
                    // 未找到直接在组下面追加
                    $str_q     = '/\[' . $key1 . '\]/';
                    $str_h     = "\[" . $key1 . "\]\n" . $key2 . "  =  " . $value;
                    $str_lower = preg_replace($str_q, $str_h, $str_lower);
                    $data      = $str_up . $str_lower;
                }
            } else {
                // 未找到配置组 追加
                $data = $data . "\n[" . $key1 . "]\n" . $key2 . "  =  " . $value;
            }
        } else {
            // 说明是顶层配置
            if (preg_match('/' . $key . '  =/', $data)) {
                // 直接替换数据
                $data = preg_replace('/([\n]{0,1}' . $key . '  =  (.*)|[\n]{0,1}' . $key . '  =)/', "\n" . $key . '  =  ' . $value, $data);
            } else {
                // 追加
                $data = $key . "  =  " . $value . "\n" . $data;
            }
        }

        file_put_contents($file, $data);
    }


-- 展开阅读全文 --
头像
【vue开发】开发UI库&插件汇总
« 上一篇 2023-01-16
【swoole】使用swoole项目启动失败各种报错的总结
下一篇 » 2023-01-24
取消
微信二维码
微信二维码
支付宝二维码

最近发表

标签列表

目录[+]