经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » PHP » 查看文章
PHP中环境变量的操作
来源:cnblogs  作者:硬核项目经理  时间:2021/5/17 12:08:46  对本文有异议

在 PHP 中,我们可以通过 phpinfo() 查看到当前系统中的环境变量信息(Environment)。在代码中,我们也可以通过两个函数,查看和修改相应的环境变量信息。

getenv() 获取环境变量信息

在不传参数的情况下,我们可以通过 getenv() 这个函数获得所有的环境变量信息。不过需要注意的是,在 CLI 环境和 SAPI 环境下它所返回的信息是不一样的。

  1. print_r(getenv());
  2. // CLI
  3. // Array
  4. // (
  5. // [USER] => zhangyue
  6. // [PATH] => /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/VMware Fusion.app/Contents/Public:/Applications/Wireshark.app/Contents/MacOS
  7. // [LOGNAME] => zhangyue
  8. // [SSH_AUTH_SOCK] => /private/tmp/com.apple.launchd.h3szqpYfSH/Listeners
  9. // [HOME] => /Users/zhangyue
  10. // [SHELL] => /bin/zsh
  11. // [__CF_USER_TEXT_ENCODING] => 0x1F5:0x19:0x34
  12. // [TMPDIR] => /var/folders/wj/t2z1cfhs0m9gq48krm8nc0vm0000gn/T/
  13. // [XPC_SERVICE_NAME] => 0
  14. // [XPC_FLAGS] => 0x0
  15. // [OLDPWD] => /Users/zhangyue/MyDoc/博客文章
  16. // [PWD] => /Users/zhangyue/MyDoc/博客文章/dev-blog/php/202006/source
  17. // [SHLVL] => 1
  18. // [TERM_PROGRAM] => vscode
  19. // [TERM_PROGRAM_VERSION] => 1.45.1
  20. // [LANG] => en_US.UTF-8
  21. // [COLORTERM] => truecolor
  22. // [VSCODE_GIT_IPC_HANDLE] => /var/folders/wj/t2z1cfhs0m9gq48krm8nc0vm0000gn/T/vscode-git-a282fa5813.sock
  23. // [GIT_ASKPASS] => /Applications/Visual Studio Code.app/Contents/Resources/app/extensions/git/dist/askpass.sh
  24. // [VSCODE_GIT_ASKPASS_NODE] => /Applications/Visual Studio Code.app/Contents/Frameworks/Code Helper (Renderer).app/Contents/MacOS/Code Helper (Renderer)
  25. // [VSCODE_GIT_ASKPASS_MAIN] => /Applications/Visual Studio Code.app/Contents/Resources/app/extensions/git/dist/askpass-main.js
  26. // [TERM] => xterm-256color
  27. // [_] => /usr/local/bin/php
  28. // [__KMP_REGISTERED_LIB_9282] => 0x1138dc0f8-cafece1d-libomp.dylib
  29. // )
  30. // SAPI Nginx
  31. // Array
  32. // (
  33. // [USER] => zhangyue
  34. // [HOME] => /Users/zhangyue
  35. // )

如果 PHP 在诸如 Fast CGI 之类的 SAPI 中运行,则此函数将始终返回由 SAPI 设置的环境变量的值,即使已使用 putenv() 来设置同名的本地环境变量。这个函数是有两个参数的,不过它们都是选填的(PHP7以前必须填变量名)。第一个参数是变量名,也就是可以返回具体的某一个环境变量信息。而第二个参数如果设置为 true 的话,仅返回本地环境变量(由操作系统或 putenv() 设置)。

  1. echo getenv("HOME"), PHP_EOL;
  2. // /Users/zhangyue
  3. // Nginx
  4. print_r($_SERVER);
  5. echo getenv("REQUEST_METHOD"), PHP_EOL; // GET
  6. echo getenv("REQUEST_METHOD", true), PHP_EOL; //

在第二个参数不为 true 的情况下,我们可以通过 getenv() 获得 \$_SERVER 、$_ENV 中的所有内容,但是,如果第二个参数为 true 的话,那么类似于 Nginx 为我们添加的那些环境变量就无法获取了。这就是第二个参数的作用,上面代码中 REQUEST_METHOD 就是 Nginx 为我们添加的环境变量,所以第二条输出语句就不会进行输出。

putenv() 设置环境变量信息

设置环境变量的函数就比较简单了,只有一个参数,不过写法是类似于 Linux 中环境变量的设置写法。

  1. putenv("A=TestA");
  2. echo getenv("A"), PHP_EOL;
  3. 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://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.php

https://www.php.net/manual/zh/function.getenv.php

关注公众号:【硬核项目经理】获取最新文章

添加微信/QQ好友:【xiaoyuezigonggong/149844827】免费得PHP、项目管理学习资料

知乎、公众号、抖音、头条搜索【硬核项目经理】

B站ID:482780532

原文链接:http://www.cnblogs.com/zyblog-coder/p/14776141.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号