在PHP中,我们可以通过phpinfo()查看当前系统中的环境变量信息(Environment)。在代码中,我们还可以通过两个函数查看和修改相应的环境变量信息。getenv()获取环境变量信息不传递参数,我们可以通过getenv()函数获取所有环境变量信息。但是需要注意的是,它返回的信息在CLI环境和SAPI环境下是不一样的。print_r(getenv());//CLI//Array//(//[USER]=>zhangyue//[PATH]=>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/VMwareFusion.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]=>真彩色//[VSCODE_GIT_IPC_HANDLE]=>/var/folders/wj/t2z1cfhs0m9gq48krm8nc0vm0000gn/T/vscode-git-a282fa5813.sock//[GIT_ASKPASS]=>/Applications/VisualStudioCode.app/Contents/Resources/app/extensions/git/dist/askpass.sh//[VSCODE_GIT_ASKPASS_NODE]=>/Applications/VisualStudioCode.app/Contents/Frameworks/CodeHelper(渲染器).app/Contents/MacOS/CodeHelper(渲染器)//[VSCODE_GIT_ASKPASS_MAIN]=>/Applications/VisualStudioCode.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//)//SAPINginx//Array//(//[USER]=>zhangyue//[HOME]=>/Users/zhangyue//)如果PHP运行在FastCGI等SAPI中,该函数将始终返回由SAPI环境变量的值,即使您已经使用putenv()设置了同名的本地环境变量。这个函数有两个参数,但是都是可选的(PHP7之前必须填写变量名)。第一个参数是变量名,即可以返回一个具体的环境变量信息。第二个参数,如果设置为true,则只返回本地环境变量(由操作系统或putenv()设置)。echogetenv("HOME"),PHP_EOL;///Users/zhangyue//Nginxprint_r($_SERVER);echogetenv("REQUEST_METHOD"),PHP_EOL;//GETechogetenv("REQUEST_METHOD",true),PHP_EOL;//在第二个参数不为true的情况下,我们可以通过getenv()获取\$_SERVER,$_ENV中的所有内容,但是如果第二个参数为true,那么就和Nginx为我们添加的类似无法获取环境变量。这是第二个参数的作用。上面代码中的REQUEST_METHOD是Nginx为我们添加的环境变量,所以不会输出第二条输出语句。putenv()设置环境变量信息设置环境变量的函数比较简单。参数只有一个,但是写法和linux中设置环境变量的方式类似。putenv("A=TestA");echogetenv("A"),PHP_EOL;echogetenv("A",true),PHP_EOL;对于putenv()的环境变量,getenv()的第二个参数设置为true也是可以的。环境变量仅在当前请求期间有效。环境在请求结束时恢复到其初始状态。设置某些环境变量也可能是一个潜在的安全漏洞。safe_mode_allowed_env_vars包含以逗号分隔的前缀列表。在安全模式下,用户只能修改带有该命令设置的前缀名的命令。默认情况下,用户只能修改以PHP_开头的环境变量(例如PHP_FOO=BAR)。注意:如果该指令为空,PHP允许用户设置任意环境变量!safe_mode_protected_env_vars指令包含一个逗号分隔的环境变量列表,用户最终无法通过putenv()修改这些变量。即使safe_mode_allowed_env_vars设置允许修改,这些变量也会受到保护。因此在php.ini中,putenv()默认被定义为危险函数,即需要在disable_functions中删除才能正常使用。如果要使用Composer,还必须开启这个功能才能正常使用。测试代码: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.php.net/manual/zh/function.putenv.phphttps://www.php.net/manual/zh/function.getenv.php各媒体平台均可搜索【硬核项目经理】
