如何使用 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 说“我更新环境值”,我的假设是他们不知道改变它们的不同方法。也许我错了,这值得澄清。 @KaloyanDoichinovsed
命令更新文件内容,这是毫无疑问的。所以很明显,意图是修改文件。
我知道 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(https://maipro.io)禁用粘性标题和缩小标题。