.env 文件如何动态修改

是否有 .env 文件编辑的最佳实践

黄威
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 27
fatrbaby

你错了,动态的修改不应该存放在.env里面。要区分好“配置”和“设置”,“设置”最好存放在数据库,或者nacos、etcd一类的东西当中。

2年前 评论

为什么要改这个文件

2年前 评论
黄威 (楼主) 2年前

没听说过动态修改 .env 参数的,那 config 还怎么读取环境配置?

2年前 评论
黄威 (楼主) 2年前
小李世界 2年前
MArtian (作者) 2年前

这个文件在调用 artisan config:cache 时候是会缓存的,如果需要动态配置 config 相关数据,可以在 ServiceProvider 中调用 config 函数动态配置,不知这样可否满足要求?

2年前 评论

可以写在数据库里啊我项目就是首次启动时将配置放入数据库中,后续就读数据库了

2年前 评论

先用 env('xxx')config('xxx') 查看是否不一样判断是哪里的问题, 然后再去进行下一步

我记得在 Laravel 中是可以把配置缓存起来的,也可以缓存路由,清理下缓存试试看把

执行这个 php artisan 命令,看看都是什么功能

2年前 评论
fatrbaby

你错了,动态的修改不应该存放在.env里面。要区分好“配置”和“设置”,“设置”最好存放在数据库,或者nacos、etcd一类的东西当中。

2年前 评论

动态配置在AppServiceProvider.php的boot方法中加载就行了啥
配置保存在数据库中,加载时用缓存读取后转到config中
//试例在AppServiceProvider中的boot加入以下代码

$configs = DB::table('config')->pluck('value','key'); 

foreach($configs as $key=>$value){

      config([$key=> $value]);

}

为了减少数据库查询
$configs = DB::table(‘config’)->pluck(‘value’,’key’);这个应换成缓存,当数据表有增删改时删除缓存就行,
在程序任意地方调用就是

config($key);//假如有一个key为web_name;调用就是config(‘web_name’)

2年前 评论

以前用的 consul

2年前 评论
ModStart 2年前

提供一个简单的方案。

定义:

public function modify($data)
{
    $contentArray = collect(file(base_path('.env'), FILE_IGNORE_NEW_LINES));

    $contentArray->transform(function ($item) use ($data) {
        foreach ($data as $key => $value) {
            $itemArr = explode('=', $item);
            if ($itemArr[0] == $key) {
                return $key . '=' . $this->format($value);
            }
        }

        return $item;
    });

    File::put(base_path('.env'), implode(PHP_EOL, $contentArray->toArray()));
}

private function format($value)
{
    if (str_contains($value, ' ') || str_contains($value, '$')) {
        $value = "\"$value\"";
    }

    return $value;
}

使用:

modify(['APP_NAME' => 'Laravel 9.0'])
2年前 评论

function modifyEnv($timeZone='Europe/Berlin') { $data=[]; if(empty($timeZone)){ $timeZone='Europe/Berlin'; } $data['APP_TIMEZONE']=$timeZone;

    $envPath = base_path() . DIRECTORY_SEPARATOR . '.env';

    $contentArray = collect(file($envPath, FILE_IGNORE_NEW_LINES));

    if('APP_TIMEZONE='.$timeZone != $contentArray->toArray()[5]){
        $contentArray->transform(function ($item) use ($data){
            foreach ($data as $key => $value){
                if(str_contains($item, $key)){
                    return $key . '=' . $value;
                }
            }
            return $item;
        });

        if(count($contentArray->toArray())>0){
            $content = implode($contentArray->toArray(), "\n");
            \Illuminate\Support\Facades\File::put($envPath, $content);
        }
    }

}
2年前 评论
Config::set('appid',$appid);
2年前 评论
JaguarJack

最终都是载入 config,不如动态修改 config 而不是 env

2年前 评论

可以自己部署一个deploy后台,直接读取目录下的env文件并打开,修改参数并保存后触发缓存刷新逻辑即可

2年前 评论
chowjiawei

人家是想要修改env文件 不是谈论如何修改配置 更好 应该从怎么修改env文件进行回答吧!

2年前 评论
ztlcoder 2年前

修改env就失去了env的意义了,env本身就是为了手动修改不影响程序代码而出来的,要修改就直接config了

2年前 评论

需要动态修改的配置,不要放config和env,你应该放到一个独立的settings并且支持分布式缓存。

2年前 评论
public function updateEnv($key, $newValue, $delim='')
{
    $path = base_path('.env');
    $oldValue = env($key);

    if ($oldValue === $newValue) {
        return;
    }

    if (file_exists($path)) {
        file_put_contents(
            $path, str_replace(
                $key.'='.$delim.$oldValue.$delim, 
                $key.'='.$delim.$newValue.$delim, 
                file_get_contents($path)
            )
        );
    }
}
2年前 评论
openstrong

可参考 php artisan key:generate 这个命令里的代码: vendor\laravel\framework\src\Illuminate\Foundation\Console\KeyGenerateCommand.php

/**
 * Write a new environment file with the given key.
 *
 * @param  string  $key
 * @return void
 */
protected function writeNewEnvironmentFileWith($key)
{
    file_put_contents($this->laravel->environmentFilePath(), preg_replace(
        $this->keyReplacementPattern(),
        'APP_KEY='.$key,
        file_get_contents($this->laravel->environmentFilePath())
    ));
}

/**
 * Get a regex pattern that will match env APP_KEY with any random key.
 *
 * @return string
 */
protected function keyReplacementPattern()
{
    $escaped = preg_quote('='.$this->laravel['config']['app.key'], '/');

    return "/^APP_KEY{$escaped}/m";
}
2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!