thinkphp6动态修改.env配置

直接贴方法吧:

首先例如修改下图配置

 已知值$val=array(1,2,3);

需要修改上图的值limitonegoods为$val

 $val=json_encode($val,JSON_UNESCAPED_UNICODE);
Env::offsetSet('USERGOODS.LIMITONEGOODS',$val);
 $envPath = root_path() . DIRECTORY_SEPARATOR . '.env';
// $envinidata=ksort(Env::get());
 $envinidata=Env::get();
 $envinidata=$this->arr_to_iniarr($envinidata);
 $inicontent=$this->arr_trinsform_ini($envinidata);
 $fp = fopen($envPath, "w") or die("Couldn't open $envPath");
 fputs($fp,$inicontent);
fclose($fp);

下面写入方法

 /**
     * author:leishaofa
     * date:20191225
     * effect:ini数组分割处理
     */
    function arr_to_iniarr(array $a, array $parent = array())
    {
        $out = [];
        foreach ($a as $k => $v){
            $key=explode('_',$k);
            if(count($key)>1 && !in_array($key[0],$out)){
                $out[]=$key[0];
                unset($key);
            }
        }
        return $out;
    }
/**
     * author:leishaofa
     * date:20191225
     * effect:ini数据组装
    */
    function arr_trinsform_ini(array $a, array $parent = array()){
        $out = ''.PHP_EOL;
        foreach ($a as $k => $v) {
            if (is_array($v)) {
                $sec = array_merge((array) $parent, (array) $k);
                $out .= '[' . join('.', $sec) . ']' . PHP_EOL;
                $out .= arr2ini($v, $sec);
            }
            else {
               if(empty($v)){
                    $out .=PHP_EOL.PHP_EOL;
                    $out .=$k.PHP_EOL;
                }else{$out .= "$k = $v" . PHP_EOL;}
            }
        }
        return $out;
    }

上面有没有错误有没有,是有的怎么优化呢

 优化后

 $val=json_encode($val,JSON_UNESCAPED_UNICODE);
            Env::offsetSet('USERGOODS.LIMITONEGOODS',$val);
            $envPath = root_path() . DIRECTORY_SEPARATOR . '.env';
           // $envinidata=ksort(Env::get());
            $envinidata=Env::get();
        
            $inicontent=self::arr_trinsform_ini($envinidata);

            print_r(Env::get());

            print_r($inicontent);
            $fp = fopen($envPath, "w") or die("Couldn't open $envPath");
            fputs($fp,$inicontent);
           fclose($fp);


/**
     * author:leishaofa
     * date:20191225
     * effect:ini数据组装
    */
    function arr_trinsform_ini(array $a, array $parent = array()){
        $out = ''.PHP_EOL;
        $keysindent=[];
        foreach ($a as $k => $v) {
            if (is_array($v)) {
                $sec = array_merge((array) $parent, (array) $k);
                $out .= '[' . join('.', $sec) . ']' . PHP_EOL;
                $out .= arr2ini($v, $sec);
            }
            else {
                $key=explode('_',$k);
                if(count($key)>1 && !in_array($key[0],$keysindent)){
                    $keysindent[]=$key[0];
                    $out .=PHP_EOL.PHP_EOL;
                    $out .="[$key[0]]".PHP_EOL;
                    unset($key[0]);
                    $out .= implode('_',$key)." = $v" . PHP_EOL;
                    //unset($key);
                }elseif (count($key)>1 && in_array($key[0],$keysindent)){
                    unset($key[0]);
                    $out .= implode('_',$key)." = $v" . PHP_EOL;
                }else{
                    $out .= "$k = $v" . PHP_EOL;
                }
            }
        }
        return $out;
    }

同时建议在里面加一个版本,修改通过获取版本号来判断文件是否存在,这个代码我就不贴出来了

 至于上面$envinidata=ksort(Env::get());用不用那我觉得看里面配置,如果在顶上面加了没分组的标识建议不要使用排序例如下图

上面多个了timelimitpage = 1没有分组就不能使用排序

thinkphp6动态修改.env配置_第1张图片

重要函数:parse_ini_file

还有可能有些人喜欢配置存session里面,看喜好,但是我还是赞同存配置里面

 

你可能感兴趣的:(thinkphp,php)