编辑:据我所知,我的问题是由于PHP的缺陷引起的。我已将此问题复制到PHP错误跟踪器中:https://bugs.php.net/bug.php?id=74143,并计划尝试实现修复。
putenv函数设置环境变量的值。根据手册,putenv在成功时返回true,在失败时返回false。
然而,我发现putenv函数有时会返回true,但不会更新当前会话的环境变量。
要重现此问题,请使用PHP FPM在Web服务器中设置一个环境变量,方法是使用fastcgi_param指令。这非常有用,因为它允许在与同一台服务器上的其他主机隔离的情况下设置环境变量。
示例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"
正如你所看到的:
- 使用getenv能够成功读取现有值,
- putenv函数返回true,表示成功,
- 新值实际上没有设置,这非常令人困惑。
我是否误解了putenv函数的目的?setenv手册页上是否缺少某些文档?如何使用putenv()更新现有环境变量?
$_SERVER
的效果符合预期。 - miken32成功返回TRUE,失败返回FALSE。
我无法让自己相信“失败”更改现有变量的值不是其他任何失败...这使得这成为了PHP的缺陷。 - user1180316