如何使用 PHP 执行 sed -i '/^MAIL_DRIVER=/s/=.*/=log/' .env 之类的东西来更新 laravel dotenv 文件中的变量值

Posted

技术标签:

【中文标题】如何使用 PHP 执行 sed -i \'/^MAIL_DRIVER=/s/=.*/=log/\' .env 之类的东西来更新 laravel dotenv 文件中的变量值【英文标题】:How to execute something like sed -i '/^MAIL_DRIVER=/s/=.*/=log/' .env using PHP to update variable value in laravel dotenv file如何使用 PHP 执行 sed -i '/^MAIL_DRIVER=/s/=.*/=log/' .env 之类的东西来更新 laravel dotenv 文件中的变量值 【发布时间】:2016-05-20 15:33:07 【问题描述】:

有时我在 Laravel 中使用 sed 更新环境值:

sed -i '/^MAIL_DRIVER=/s/=.*/=log/' .env

任何人都可以建议和替代使用 php 执行此操作吗?

更新:我以 Laravel/dotenv .env 文件为例来为这个问题提供一些背景信息,但我对如何以编程方式更改环境变量不感兴趣,我感兴趣的是如何使用 php 文件执行 sed “like”操作操作函数,或者如果存在一些库来做到这一点。我也知道我可以使用 system o passthru 函数,这就是我已经在做的我只是好奇如何使用 PHP 以这种方式操作文件

【问题讨论】:

请澄清 - 您是要永久更新文件,还是只是更改设置? 永久更改文件。我以 Laravel/dotenv .env 文件为例,但我对如何使用 PHP 执行与 Linux 中的 sed 相同的操作的通用解决方案感兴趣。 好的,在这种情况下你需要@Bogdan 的解决方案 【参考方案1】:

虽然 Laravel 使用 dotenv 库进行读取,但它无法以编程方式更新 .env 文件。但是,您可以使用 preg_replace 更新配置值。这是一个单行解决方案:

file_put_contents(base_path('.env'), preg_replace("/(MAIL_DRIVER)=(.*)/", "$1=log", file_get_contents(base_path('.env'))));

这也是解决方案扩展到多行并解释:

// Read the .env file contents
$env = file_get_contents(base_path('.env'));

// Replace the value using regex matching
$env = preg_replace("/(MAIL_DRIVER)=(.*)/", "$1=log", $env);

// Write the updated contents to the file
file_put_contents(base_path('.env'), $env);

【讨论】:

这只是错误 - getenv() 和 putenv() 函数正是用于此目的。 @KaloyanDoichinov 请参阅我对您的答案的评论以进行澄清。 我明白,但 OP 说“我更新环境值”,我的假设是他们不知道改变它们的不同方法。也许我错了,这值得澄清。 @KaloyanDoichinov sed 命令更新文件内容,这是毫无疑问的。所以很明显,意图是修改文件。 我知道 sed 做了什么,我的意思是 OP 可能正在(错误地)使用它,因为他/她不知道 putenv 的存在。无论如何,现在有 2 个答案,这两个答案都适用于特定目的。【参考方案2】:

您不需要系统调用来实现这一点。你应该使用putenv()

putenv('MAIL_DRIVER=/log');

【讨论】:

OP 想要更新.env 文件内容(sed 命令将修改文件的内容)并且您的解决方案仅临时更新内存中的值。正如putenv 文档所述:“环境变量将仅在当前请求期间存在。在请求结束时,环境将恢复到其原始状态。”

以上是关于如何使用 PHP 执行 sed -i '/^MAIL_DRIVER=/s/=.*/=log/' .env 之类的东西来更新 laravel dotenv 文件中的变量值的主要内容,如果未能解决你的问题,请参考以下文章

php Mai Pro - 强制主要和次要侧边栏宽度相同

php 从Mai Pro(https://maipro.io)禁用粘性标题和缩小标题。

php 创建新收藏夹的初学者代码,用于Mai Favorites插件(https://maipro.io)

存在点和下划线时使用 sed 搜索和替换

Bigger-Mai 养成计划,subprocess模块

打开高效文本编辑之门_调用Linux的sed命令