网易首页 > 网易号 > 正文 申请入驻

3分钟短文 | Laravel 动态修改 env 环境变量的值!

0
分享至

引言

为了把配置参数独立出来,用以区分开发环境,线上环境等功能, 或者手动切换缓存的驱动,队列的驱动,邮件服务器地址,等等等等, 这些可以方便地标记。所以laravel使用 .env 文件包裹这些配置数据,也就是键值对。

学习时间

一般情况下,我们不允许修改env文件的内容,除非手动处理。可是在编程中难免遇到非修改不可的情况, 那么又该如何动态地操作env文件内的键值对呢?

假设对于系统使用 key:generate 生成的 APP_KEY 不安全,在做自动化部署,批量部署时有动态修改 APP_KEY 这个键的需求。该怎么来实现呢?

其实,env文件不过是一个文本文件,遵循 key=value 这样的标准格式进行书写,全程使用字符串匹配, 单行直到换行符停止。

那么修改 env 文件内容,无非就是找到相关的键,然后将值替换掉,如此而已。

下面给出第一个版本,也就是简单粗暴的 file_put_contents,先获取env文件的路径:

$path = base_path('.env');

需要判断文件是否存在:

if (file_exists($path)){ // 文件存在}

文件存在则先读出文件的所有内容到一个字符串变量内:

$origin = file_get_contents($path);

假设我们的新 APP_KEY 存在变量 $new_key 内,首先获取原始的 APP_KEY的值:

$old_key = env('APP_KEY');

字符串操作当然要使用字符串替换函数直接匹配,我们使用 str_replace,env文件的数据量毕竟不大, 这么也也没有太大性能的问题。

$result = str_replace('APP_KEY=' . $old_key, $new_key, $origin);

这样$result内存储的就是最新的env文件的值,接下来写入env文件就行了:

file_put_contents($result);

默认是覆写,所以执行完程序,env文件就是最新的动态修改的数据了。

深入一步

上面的代码还是有瑕疵的,因为对于错误故障处理基本上没有,这很容易造成错误。 另外对于env这么重要的文件操作,直接使用字符串替换,整个文件的读和覆写, 本身的风险就非常高。

如何改造我们的操作方式,使其更为安全呢?我们需要兼容性更好的代码。本节我们尝试使用正则匹配的方式, 来解析env文件,并逐行读取,逐行操作,逐行判断, 对于存在的键值,进行覆盖;对于不存在的,则进行创建。 这样就可以兼容新建和更新两种功能,且支持的键值更为灵活。

封装为助手函数,假设传入的参数为数组,且是关联数组。声明函数如下:

function updateEnv($data = array()){}

函数体内书写逻辑,首先非空判断:

if (! count($data)) {return;}

如果不是关联数组,也同样不接受,因为env文件必须明确指定键和值。 关联数组只用判断数组的键与自动序列化的键不同即可:

if (array_keys($data) === range(0, count($data) - 1)) {return;}

准备匹配模式:

$pattern = '/([^\=]*)\=[^\n]*/';

这就是env文件书写的格式。上一节我们已经介绍过了。我们把旧的env文件读入一个数组,并声明新的数组,存储最新的配置文件数据:

$envFile = base_path() . '/.env';$lines = file($envFile);$newLines = [];

然后遍历旧的文件数据,逐行解析:

foreach ($lines as $line) { preg_match($pattern, $line, $matches); if (!count($matches)) { $newLines[] = $line; continue; } if (!key_exists(trim($matches[1]), $data)) { $newLines[] = $line; continue; } $line = trim($matches[1]) . "={$data[trim($matches[1])]}\n"; $newLines[] = $line;}

上面只是一个大致的处理流程,这个解析过程,你可以独立为自定义函数,或者其他解析引擎,具有通用性。

最后把解析完的新数据,完整写入env文件内:

$newContent = implode('', $newLines);file_put_contents($envFile, $newContent);

至此,env文件的更新操作就完成了。

写在最后

本文通过两种方式实现了在程序内动态创建和更新env全局配置文件文件数据的功能, 第二种方法容错性更好,具有通用性,扩展性强,所以我们推荐。 第一种做法没有错误处理,生产环境下几乎不能用。大家知道思路就好了。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
WTT曝出大冷门,首个出局大种子选手诞生,印度怪球手晋级

WTT曝出大冷门,首个出局大种子选手诞生,印度怪球手晋级

极度说球
2026-05-24 13:31:44
孔蒂:一个月前我就告诉德佬我决定离开,一些环境我无法改变

孔蒂:一个月前我就告诉德佬我决定离开,一些环境我无法改变

懂球帝
2026-05-25 03:34:14
死了得了,我才22岁凭啥扛!大连宝妈带2岁娃送餐崩溃,丈夫躺平

死了得了,我才22岁凭啥扛!大连宝妈带2岁娃送餐崩溃,丈夫躺平

冷月侃娱乐
2026-05-21 17:40:53
纪委大数据有多厉害?这几类行为一查一个准,公职人员别再侥幸

纪委大数据有多厉害?这几类行为一查一个准,公职人员别再侥幸

细说职场
2026-05-18 09:37:45
媒体称美伊下一轮会谈可能在6月5日举行

媒体称美伊下一轮会谈可能在6月5日举行

界面新闻
2026-05-24 16:37:04
钱多有啥用?贝克汉姆身家超100亿,4个孩子却一个比一个让人揪心

钱多有啥用?贝克汉姆身家超100亿,4个孩子却一个比一个让人揪心

小椰的奶奶
2026-05-25 03:21:03
一脸憔悴、表情硬挤,却硬要在古装剧中演权臣,网友:男主成败笔

一脸憔悴、表情硬挤,却硬要在古装剧中演权臣,网友:男主成败笔

一娱三分地
2026-05-04 15:35:47
太难了!中大型SUV也迎来降价潮:最大让利41%,豪华SUV成重灾区

太难了!中大型SUV也迎来降价潮:最大让利41%,豪华SUV成重灾区

沙雕小琳琳
2026-05-24 22:14:45
越扒瓜越大!交大女学生吞奖金再添猛料,不止想进体制内这么简单

越扒瓜越大!交大女学生吞奖金再添猛料,不止想进体制内这么简单

观史搜寻着
2026-05-21 05:41:15
世界杯落选球星榜单出炉!两大亿元球星领衔,英格兰六大球星缺席

世界杯落选球星榜单出炉!两大亿元球星领衔,英格兰六大球星缺席

郝小小看体育
2026-05-23 21:51:50
基辅遭大规模弹道导弹袭击;乌再次打击“埃森海军上将”号护卫舰

基辅遭大规模弹道导弹袭击;乌再次打击“埃森海军上将”号护卫舰

近距离
2026-05-24 08:12:48
60岁阿姨疯狂买买买,还专门租房用来放快递:它们不会主动离开我

60岁阿姨疯狂买买买,还专门租房用来放快递:它们不会主动离开我

澎湃新闻
2026-05-24 19:05:02
两匹马受惊闯入小区 5岁女童被缰绳绕颈拖行近2公里身亡 女童妈妈:跑不过马,好绝望

两匹马受惊闯入小区 5岁女童被缰绳绕颈拖行近2公里身亡 女童妈妈:跑不过马,好绝望

闪电新闻
2026-05-24 12:38:27
关系没变糟,但你们已经远了

关系没变糟,但你们已经远了

心事寄山海
2026-05-24 01:02:48
中超积分榜变动大!上海申花1-2爆冷 辽宁5-0升第8 山东泰山遭绝

中超积分榜变动大!上海申花1-2爆冷 辽宁5-0升第8 山东泰山遭绝

郝小小看体育
2026-05-24 22:07:29
导演只是请窦骁来演个纨绔子弟,不想他一出场,翟子路20集白演了

导演只是请窦骁来演个纨绔子弟,不想他一出场,翟子路20集白演了

童叔不飙车
2026-05-22 15:45:45
歼35采购计划出现变动,巴基斯坦多方考量,持续对比多款西式战机

歼35采购计划出现变动,巴基斯坦多方考量,持续对比多款西式战机

趣味八卦
2026-05-24 14:40:23
别再被隋唐演义误导,正史中公认武力值最高的,是这五位顶尖猛将

别再被隋唐演义误导,正史中公认武力值最高的,是这五位顶尖猛将

长风文史
2026-05-21 17:01:36
周鹏任中共华容县委书记

周鹏任中共华容县委书记

湖南法治报
2026-05-24 16:51:14
终于知道苹果直营店的员工每天都很有活力的原因了,网友:门槛高

终于知道苹果直营店的员工每天都很有活力的原因了,网友:门槛高

另子维爱读史
2026-05-23 08:00:45
2026-05-25 06:15:01
程序员小助手
程序员小助手
专注编程知识IT领域原创作者
254文章数 1793关注度
往期回顾 全部

科技要闻

我戴着摄像头上班,正在帮AI抢走我饭碗

头条要闻

山西矿难遇难者家属:父亲年过半百 我们一直劝他别干了

头条要闻

山西矿难遇难者家属:父亲年过半百 我们一直劝他别干了

体育要闻

唐斯发牌,大头逆袭:骑士跌向残忍夏季

娱乐要闻

王鹤棣掉粉超20万!代言和作品遭抵制

财经要闻

什么情况下,本轮AI大行情会结束?

汽车要闻

国民家轿再上新 帝豪向上系列限时5.59万起

态度原创

数码
房产
家居
公开课
军事航空

数码要闻

618游戏本怎么选?ROG魔霸新锐2026来袭,福利秒杀让战力飞

房产要闻

疯狂周末,海口楼市突然爆了!

家居要闻

低调传承 温润沉静

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

深夜美伊谈判传来大消息 特朗普最新表态

无障碍浏览 进入关怀版