日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

PHP中環(huán)境變量的操作

 硬核項(xiàng)目經(jīng)理 2021-05-31

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());

// CLI
// Array
// (
//     [USER] => zhangyue
//     [PATH] => /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/VMware Fusion.app/Contents/Public:/Applications/Wireshark.app/Contents/MacOS
//     [LOGNAME] => zhangyue
//     [SSH_AUTH_SOCK] => /private/tmp/com.apple.launchd.h3szqpYfSH/Listeners
//     [HOME] => /Users/zhangyue
//     [SHELL] => /bin/zsh
//     [__CF_USER_TEXT_ENCODING] => 0x1F5:0x19:0x34
//     [TMPDIR] => /var/folders/wj/t2z1cfhs0m9gq48krm8nc0vm0000gn/T/
//     [XPC_SERVICE_NAME] => 0
//     [XPC_FLAGS] => 0x0
//     [OLDPWD] => /Users/zhangyue/MyDoc/博客文章
//     [PWD] => /Users/zhangyue/MyDoc/博客文章/dev-blog/php/202006/source
//     [SHLVL] => 1
//     [TERM_PROGRAM] => vscode
//     [TERM_PROGRAM_VERSION] => 1.45.1
//     [LANG] => en_US.UTF-8
//     [COLORTERM] => truecolor
//     [VSCODE_GIT_IPC_HANDLE] => /var/folders/wj/t2z1cfhs0m9gq48krm8nc0vm0000gn/T/vscode-git-a282fa5813.sock
//     [GIT_ASKPASS] => /Applications/Visual Studio Code.app/Contents/Resources/app/extensions/git/dist/askpass.sh
//     [VSCODE_GIT_ASKPASS_NODE] => /Applications/Visual Studio Code.app/Contents/Frameworks/Code Helper (Renderer).app/Contents/MacOS/Code Helper (Renderer)
//     [VSCODE_GIT_ASKPASS_MAIN] => /Applications/Visual Studio Code.app/Contents/Resources/app/extensions/git/dist/askpass-main.js
//     [TERM] => xterm-256color
//     [_] => /usr/local/bin/php
//     [__KMP_REGISTERED_LIB_9282] => 0x1138dc0f8-cafece1d-libomp.dylib
// )

// SAPI Nginx
// Array
// (
//     [USER] => zhangyue
//     [HOME] => /Users/zhangyue
// )

如果 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;
// /Users/zhangyue

// Nginx
print_r($_SERVER);
echo getenv("REQUEST_METHOD"), PHP_EOL; // GET
echo getenv("REQUEST_METHOD"true), 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");
echo getenv("A"), PHP_EOL;
echo getenv("A"true), PHP_EOL;

對(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

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多