編輯:據我所知,我的問題是因爲PHP的缺陷。我已將此問題複製到PHP錯誤跟蹤器中:https://bugs.php.net/bug.php?id=74143並計劃嘗試並實施修復。如何使用putenv()更新現有的環境變量?
putenv函數設置環境變量的值。根據手冊,putenv成功返回true,失敗則返回false。
但是,我發現putenv函數有時會返回true而不更新當前會話的環境變量。
要重現此問題,請使用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"
正如可以看到:
- 成功讀取現有值,
- putenv函數返回true,表示成功,
- 新值沒有實際設置,這是令人難以置信的混淆。
我誤解了putenv函數的用途是什麼? setenv手冊頁面上是否存在一些缺失的文檔?我如何使用putenv()來更新現有的環境變量?
我從來沒見過這種行爲我自己。您是否嘗試先刪除舊值? 'putenv(「TESTVAR_ENV」)'應該清除該值,或者可以嘗試使用'$ _SERVER'來代替? – miken32
實際上,只是用Nginx和PHP-FPM測試了這個,而不是CLI,我看到了同樣的情況。 – miken32
您認爲這是PHP還是PHP-FPM的錯誤? – Greg