gpt4 book ai didi

php - 如何使用 putenv() 更新现有环境变量?

转载 作者:行者123 更新时间:2023-12-03 00:16:16 26 4
gpt4 key购买 nike

编辑:据我所知,我的问题是由于 PHP 的缺陷造成的。我已将此问题复制到 PHP 错误跟踪器:https://bugs.php.net/bug.php?id=74143并计划尝试实现修复。

<小时/>

putenv 函数设置环境变量的值。根据手册,putenv 成功时返回 true,失败时返回 false。

但是,我发现 putenv 函数有时会返回 true,而不会更新当前 session 的环境变量。

要重现此问题,请使用 fastcgi_param 指令在使用 PHP FPM 的 Web 服务器中设置环境变量。这非常有用,因为它允许设置与同一服务器上的其他主机隔离的环境变量。

示例 nginx.conf:

location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
fastcgi_param TESTVAR_ENV old-value;
include fastcgi_params;
}

示例 test.php:

var_dump(getenv("TESTVAR_ENV"));
var_dump(putenv("TESTVAR_ENV=new-value"));
var_dump(getenv("TESTVAR_ENV"));

test.php 的输出:

string(12) "old-value"
bool(true)
string(12) "old-value"

如您所见:

  1. getenv 成功读取现有值,
  2. putenv函数返回true,表示成功,
  3. 新值并未实际设置,这非常令人困惑。

我是否误解了 putenv 函数的目的是什么? setenv 手册页上是否缺少一些文档?如何使用 putenv() 更新现有环境变量?

最佳答案

这很有趣。经过调查我发现有一个undocumented parameter对于getenv()

调用 putenv("TESTVAR_ENV=new-value") 后调用 getenv("TESTVAR_ENV", true) 返回 new-value 为预期的。但是,在没有先显式设置值的情况下调用时,getenv("TESTVAR_ENV", true) 返回 false。

阅读 source似乎如果 local_only 设置为 false(默认),则使用 sapi_getenv 获取该值,而将 local_only 设置为 true 则使用 native 使用getenv

此外,如果 sapi_getenv 不返回值,则调用 getenv 作为后备。这意味着如果您根本没有在 nginx/Apache 配置中设置 TESTVAR_ENVputenv/getenv 将按预期工作。

回顾一下:

  • getenv(name) 从 SAPI (php-fpm) 内部环境表中搜索,如果未设置变量,则回退到操作系统环境。
  • getenv(name, true) 仅从操作系统环境中搜索,该环境不一定(取决于 SAPI)包含在 Web 服务器配置中注册的变量。
  • putenv() 始终仅更新操作系统环境。

我使用以下方法来测试这一点:

header("Content-Type: text/plain");

dump_env();
echo 'getenv("TESTVAR_ENV") => ' .
var_export(getenv("TESTVAR_ENV"), true) . "\n";
echo 'getenv("TESTVAR_ENV", true) => ' .
var_export(getenv("TESTVAR_ENV", true), true) . "\n";
echo "-----------\n";
echo 'putenv("TESTVAR_ENV=new-value") => ' .
var_export(putenv("TESTVAR_ENV=new-value"), true) . "\n";
dump_env();
echo 'getenv("TESTVAR_ENV") => ' .
var_export(getenv("TESTVAR_ENV"), true) . "\n";
echo 'getenv("TESTVAR_ENV", true) => ' .
var_export(getenv("TESTVAR_ENV", true), true) . "\n";

function dump_env() {
echo "--- env ---\n" . `env` . "-----------\n";
}

关于php - 如何使用 putenv() 更新现有环境变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42379823/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com