【发布时间】:2017-07-11 19:31:45
【问题描述】:
编辑:据我所知,我的问题是因为 PHP 存在缺陷。我已将此问题复制到此处的 PHP 错误跟踪器:https://bugs.php.net/bug.php?id=74143 并计划尝试实施修复。
putenv 函数设置环境变量的值。根据手册,putenv 成功返回 true,失败返回 false。
但是,我发现 putenv 函数有时会返回 true 而不更新当前会话的环境变量。
要重现此问题,请使用 fastcgi_param 指令在使用 PHP FPM 的网络服务器中设置环境变量。这非常有用,因为它允许将环境变量设置为与同一服务器上的其他主机隔离。
示例 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() 更新现有的环境变量?
【问题讨论】:
-
我自己还没有看到这种行为。您是否尝试过先删除旧值?
putenv("TESTVAR_ENV")应该清除该值,或者尝试改用$_SERVER? -
实际上,刚刚用 Nginx 和 PHP-FPM 测试了这个,而不是 CLI,我看到了同样的东西。
-
您认为这是 PHP 还是 PHP-FPM 的错误?
-
嗯,我刚刚在 Apache 中使用 mod_php 进行了尝试,得到了相同的行为。
-
php.net 页面显示
Returns TRUE on success or FALSE on failure.我无法说服自己“未能”更改现有 var 的值不是失败......这就是一个 php 缺陷。
标签: php environment-variables getenv