在 PHP 中,咱们能够通过 phpinfo() 查看到以后零碎中的环境变量信息(Environment)。在代码中,咱们也能够通过两个函数,查看和批改相应的环境变量信息。
getenv() 获取环境变量信息
在不传参数的状况下,咱们能够通过 getenv() 这个函数取得所有的环境变量信息。不过须要留神的是,在 CLI 环境和 SAPI 环境下它所返回的信息是不一样的。
<code class="php">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 中运行,则此函数将始终返回由 SAPI 设置的环境变量的值,即便已应用 putenv() 来设置同名的本地环境变量。这个函数是有两个参数的,不过它们都是选填的(PHP7以前必须填变量名)。第一个参数是变量名,也就是能够返回具体的某一个环境变量信息。而第二个参数如果设置为 true 的话,仅返回本地环境变量(由操作系统或 putenv() 设置)。
<code class="php">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; //
在第二个参数不为 true 的状况下,咱们能够通过 getenv() 取得 \$_SERVER 、$_ENV 中的所有内容,然而,如果第二个参数为 true 的话,那么相似于 Nginx 为咱们增加的那些环境变量就无奈获取了。这就是第二个参数的作用,下面代码中 REQUEST_METHOD 就是 Nginx 为咱们增加的环境变量,所以第二条输入语句就不会进行输入。
putenv() 设置环境变量信息
设置环境变量的函数就比较简单了,只有一个参数,不过写法是相似于 Linux 中环境变量的设置写法。
<code class="php">putenv("A=TestA"); echo getenv("A"), PHP_EOL; echo getenv("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://www.php.net/manual/zh/function.putenv.php
https://www.php.net/manual/zh/function.getenv.php
各自媒体平台均可搜寻【硬核项目经理】