PHP中環(huán)境變量的操作在 PHP 中,我們可以通過 phpinfo() 查看到當(dāng)前系統(tǒng)中的環(huán)境變量信息(Environment)。在代碼中,我們也可以通過兩個(gè)函數(shù),查看和修改相應(yīng)的環(huán)境變量信息。 getenv() 獲取環(huán)境變量信息在不傳參數(shù)的情況下,我們可以通過 getenv() 這個(gè)函數(shù)獲得所有的環(huán)境變量信息。不過需要注意的是,在 CLI 環(huán)境和 SAPI 環(huán)境下它所返回的信息是不一樣的。 print_r(getenv()); 如果 PHP 在諸如 Fast CGI 之類的 SAPI 中運(yùn)行,則此函數(shù)將始終返回由 SAPI 設(shè)置的環(huán)境變量的值,即使已使用 putenv() 來設(shè)置同名的本地環(huán)境變量。這個(gè)函數(shù)是有兩個(gè)參數(shù)的,不過它們都是選填的(PHP7以前必須填變量名)。第一個(gè)參數(shù)是變量名,也就是可以返回具體的某一個(gè)環(huán)境變量信息。而第二個(gè)參數(shù)如果設(shè)置為 true 的話,僅返回本地環(huán)境變量(由操作系統(tǒng)或 putenv() 設(shè)置)。 echo getenv("HOME"), PHP_EOL; 在第二個(gè)參數(shù)不為 true 的情況下,我們可以通過 getenv() 獲得 \$_SERVER 、$_ENV 中的所有內(nèi)容,但是,如果第二個(gè)參數(shù)為 true 的話,那么類似于 Nginx 為我們添加的那些環(huán)境變量就無法獲取了。這就是第二個(gè)參數(shù)的作用,上面代碼中 REQUEST_METHOD 就是 Nginx 為我們添加的環(huán)境變量,所以第二條輸出語句就不會(huì)進(jìn)行輸出。 putenv() 設(shè)置環(huán)境變量信息設(shè)置環(huán)境變量的函數(shù)就比較簡單了,只有一個(gè)參數(shù),不過寫法是類似于 Linux 中環(huán)境變量的設(shè)置寫法。 putenv("A=TestA"); 對(duì)于 putenv() 的環(huán)境變量,getenv() 的第二個(gè)參數(shù)設(shè)置為 true 也是可以獲取到的。環(huán)境變量僅存活于當(dāng)前請(qǐng)求期間。在請(qǐng)求結(jié)束時(shí)環(huán)境會(huì)恢復(fù)到初始狀態(tài)。 設(shè)置特定的環(huán)境變量也有可能是一個(gè)潛在的安全漏洞。safe_mode_allowed_env_vars 包含了一個(gè)以逗號(hào)分隔的前綴列表。在安全模式下,用戶可以僅能修改用該指令設(shè)定的前綴名稱的指令。默認(rèn)情況下,用戶僅能夠修改以 PHP_ 開頭的環(huán)境變量(例如 PHP_FOO=BAR)。注意:如果此指令是空的,PHP允許用戶設(shè)定任意環(huán)境變量! safe_mode_protected_env_vars 指令包含了逗號(hào)分隔的環(huán)境變量列表,使用戶最終無法通過 putenv() 修改。即使 safe_mode_allowed_env_vars 設(shè)置允許修改,這些變量也會(huì)被保護(hù)。 所以,在 php.ini 中,默認(rèn)情況下 putenv() 是定義為危險(xiǎn)函數(shù)的,也就是在 disable_functions 中需要?jiǎng)h除掉這個(gè)函數(shù)才能正常使用,如果要使用 Composer 的話也必須要開啟這個(gè)函數(shù)才能正常使用。 測試代碼: https://github.com/zhangyue0503/dev-blog/blob/master/php/202006/source/PHP%E4%B8%AD%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E7%9A%84%E6%93%8D%E4%BD%9C.php 參考文檔: https://www./manual/zh/function.putenv.php https://www./manual/zh/function.getenv.php |
|