.env 文件如何动态修改

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

黄威
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 27
fatrbaby

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

3年前 评论

为什么要改这个文件

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

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

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

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

3年前 评论

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

3年前 评论

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

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

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

3年前 评论
fatrbaby

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

3年前 评论

动态配置在 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’)

3年前 评论

以前用的 consul

3年前 评论
MZ0x01 3年前

提供一个简单的方案。

定义:

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'])
3年前 评论

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);
        }
    }

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

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

3年前 评论

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

3年前 评论
chowjiawei
3年前 评论
chowjiawei (作者) 3年前
chowjiawei

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

3年前 评论
ztlcoder 3年前

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

3年前 评论

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

3年前 评论
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)
            )
        );
    }
}
3年前 评论
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";
}
3年前 评论