PHP中环境变量的操作
在 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/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() 设置)。
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 中环境变量的设置写法。
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
关注公众号:【硬核项目经理】获取最新文章
添加微信/QQ好友:【xiaoyuezigonggong/149844827】免费得PHP、项目管理学习资料
知乎、公众号、抖音、头条搜索【硬核项目经理】
B站ID:482780532
PHP中环境变量的操作的更多相关文章
- Linux中环境变量中文件执行顺序
Linux 的变量可分为两类:环境变量和本地变量 环境变量:或者称为全局变量,存在于所有的shell 中,在你登陆系统的时候就已经有了相应的系统定义的环境变量了.Linux 的环境变量具有 ...
- Go 环境变量相关操作
Go语言中os包提供了一些环境变量的操作封装.包括: 设置环境变量:Setenv 获取环境变量:Getenv 删除指定的环境变量:Unsetenv 获取所有环境变量:Environ 清除所有环境变量: ...
- u-boot中环境变量的实现
转载:http://blog.chinaunix.net/uid-28236237-id-3867041.html U-boot中通过环境参数保存一些配置,这些配置可以通过修改环境参数.保存环境参数. ...
- setlocal启动批处理文件中环境变量的本地化
setlocal启动批处理文件中环境变量的本地化 在执行 SETLOCAL 之后所做的环境改动只限于批处理文件.要还原原先的设置,必须执行 ENDLOCAL. 学习了:https://baike.ba ...
- ubuntu下关于profile和bashrc中环境变量的理解(转)
ubuntu下关于profile和bashrc中环境变量的理解(转) (0) 写在前面 有些名词可能需要解释一下.(也可以先不看这一节,在后面看到有疑惑再上来看相关解释) $PS1和交互式运行(r ...
- Linux中环境变量文件及配置
Linux中环境变量文件及配置 一.环境变量文件介绍 转自:http://blog.csdn.net/cscmaker/article/details/7261921 Linux中环境变量包括系统 ...
- Linux中环境变量文件及配置(转载)
一.环境变量文件介绍 转自:http://blog.csdn.net/cscmaker/article/details/7261921 Linux中环境变量包括系统级和用户级,系统级的环境变量是每个登 ...
- Node.js中环境变量process.env详解
Node.js中环境变量process.env详解process | Node.js API 文档http://nodejs.cn/api/process.html官方解释:process 对象是一个 ...
- Linux中环境变量文件
一.环境变量文件介绍 转自:http://blog.csdn.net/cscmaker/article/details/7261921 Linux中环境变量包括系统级和用户级,系统级的环境变量是每个登 ...
随机推荐
- 修改Linux系统的默认语言编码集
RedHat 今天晚上发现服务器上vi的界面提示变成了乱码,只能将XShell的编码改为GBK才能正常显示,导致consolas字体无法使用,GBK编码下的字体丑陋无比,无法忍受,一轮google之后 ...
- Vue 实现微信提示浏览器转跳功能
<template> <div class="main"> <div :class="show==true ? 'block':'block ...
- JavaScript学习02(js快速入门)
快速入门 基本语法 JavaScript的语法和Java的语法类似,每个语句以;结束,语句块用{...}.但是JavaScrip并不强制要求在每个语句的结尾加;,浏览器中负责执行JavaScript代 ...
- 详细讲讲netty的pipiline!
前言 提到 Netty 首当其冲被提起的肯定是支持它承受高并发的线程模型,说到线程模型就不得不提到 NioEventLoopGroup 这个线程池,接下来进入正题. 线程模型 首先来看一段 Netty ...
- antd+vue3实现动态表单的自动校验
由于vue3用的人还不多,所以有些问题博主踩了坑只能自己爬出来了,特此做个记录.如有错误,请大家指正. 回归正题,我所做的业务是,动态添加表单项,对每一项单独做校验,效果如下: 主要代码如下: 1 & ...
- Pikachu-CSRF模块
一.概述 Cross-site request forgery 简称为"CSRF",在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接),然后欺骗目标用户进行点击, ...
- 一个tomcat配置多个不同端口的项目
1.将要同时启动的项目放入不同的webapps文件夹中 2.修改tomcat安装目录下的conf-->setting.xml文件 <?xml version="1.0" ...
- CPU 指令环 ring0,ring1,ring2,ring3
Intel的CPU将特权级别分为4个级别:RING0,RING1,RING2,RING3. Windows只使用其中的两个级别RING0和RING3,RING0只给操作系统用,RING3谁都能用.如果 ...
- Something about 树链剖分
声明:部分思路与图片源于OI Wiki 关于树链剖分 树链剖分用于将树分割成若干条链的形式,以维护树上路径的信息. 树链剖分有多种形式,如 重链剖分,长链剖分 和用于 $LCT$ 的剖分,大多数情况下 ...
- C# WPF 后台调整怎样使用代码把指定控件的Z序调整到最前面呢?
Panel.SetZIndex(rectangle1, 2); //把前台名称为rectangle1的矩形的ZIndex设置为2