PHP中环境变量 $_SERVER 和 $_ENV的区别是什么

php中 $_SERVER$_ENV 使用的时候,如果$_ENV不是空的,会发现web环境下他们的值通常是一样的 。不过这两个变量还是有区别的,他们都表示当前的运行的环境。但是还是有区别的。

首先直观的看看他们的区别是什么?

echo "PHP RUN ..." . php_sapi_name() . "\n";

echo 'in _SERVER not in_ENV :';
iset = array_diff_key(_SERVER, _ENV);
foreach(iset as k =>v) {
    echo k . ' ';
}

echo "\n";
echo 'in_ENV not in _SERVER :';iset = array_diff_key(_ENV,_SERVER);
foreach(iset ask => v) {
    echok . ' ';
}

web环境的输出
web环境下下的env和server变量的区别
可以看到没有区别。(至少两个变量的$key是没有区别的)
shell环境的输出
shell环境下下的env和server变量的区别
可以看到以下的区别

SCRIPT_NAME
SCRIPT_FILENAME
PATH_TRANSLATED
DOCUMENT_ROOT
REQUEST_TIME_FLOAT
REQUEST_TIME
argv
argc

直观的看,shell环境中_ENV比_SERVER少了几个值$_SERVER 中的数据更多些。

PHP手册里的解释 $_ENV

通过环境方式传递给当前脚本的变量的数组。
这些变量被从 PHP 解析器的运行环境导入到 PHP 的全局命名空间。很多是由支持 PHP 运行的 Shell 提供的,并且不同的系统很可能运行着不同种类的 Shell,所以不可能有一份确定的列表。请查看你的 Shell 文档来获取定义的环境变量列表。
其他环境变量包含了 CGI 变量,而不管 PHP 是以服务器模块还是 CGI 处理器的方式运行。

PHP手册里的解释 $_SERVER

$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。不能保证每个服务器都提供全部项目;服务器可能会忽略一些,或者提供一些没有在这里列举出来的项目。这也就意味着大量的此类变量都会在» CGI 1.1 规范中说明,所以应该仔细研究一下。

上面说的抽象了一点,直接看下 $_ENV$_SERVER的值会更直接一点。需要明白的是两个值都是环境变量,所以不同的运行环境值是有区别的

输出一下 $_SERVER的值

USER ==> ###
HOME ==> ###
HTTP_COOKIE ==> ####
HTTP_ACCEPT_LANGUAGE ==> zh-CN,zh;q=0.9
HTTP_ACCEPT_ENCODING ==> gzip, deflate, br
HTTP_ACCEPT ==> text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
HTTP_USER_AGENT ==> Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
HTTP_UPGRADE_INSECURE_REQUESTS ==> 1
HTTP_CACHE_CONTROL ==> max-age=0
HTTP_CONNECTION ==> keep-alive
HTTP_HOST ==> test.phpjiaocheng.com
REDIRECT_STATUS ==> 200
SERVER_NAME ==> ~^(\w+)\.phpjiaocheng.com
SERVER_PORT ==> 443
SERVER_ADDR ==> #####
REMOTE_PORT ==> 22506
REMOTE_ADDR ==> ######
SERVER_SOFTWARE ==> nginx/1.16.0
GATEWAY_INTERFACE ==> CGI/1.1
HTTPS ==> on
REQUEST_SCHEME ==> https
SERVER_PROTOCOL ==> HTTP/1.1
DOCUMENT_ROOT ==> /webroot/test.phpjiaocheng.com
DOCUMENT_URI ==> /t.php
REQUEST_URI ==> /t.php
SCRIPT_NAME ==> /t.php
CONTENT_LENGTH ==> 
CONTENT_TYPE ==> 
REQUEST_METHOD ==> GET
QUERY_STRING ==> 
SCRIPT_FILENAME ==> /webroot/test.phpjiaocheng.com/t.php
PHP_VALUE ==> open_basedir=/webroot/test.phpjiaocheng.com:/tmp
FCGI_ROLE ==> RESPONDER
PHP_SELF ==> /t.php
REQUEST_TIME_FLOAT ==> 1556884842.9501
REQUEST_TIME ==> 1556884842

输出一下 $_ENV的值 (shell环境)

输出的结果可能是是空的,查看下php的配置文件 php.ini

; This directive determines which super global arrays are registered when PHP
; starts up. G,P,C,E & S are abbreviations for the following respective super
; globals: GET, POST, COOKIE, ENV and SERVER. There is a performance penalty
; paid for the registration of these arrays and because ENV is not as commonly
; used as the others, ENV is not recommended on productions servers. You
; can still get access to the environment variables through getenv() should you
; need to.
; Default Value: "EGPCS"
; Development Value: "GPCS"
; Production Value: "GPCS";
; http://php.net/variables-order
variables_order = "GPCS"

关注的中重点是只当前的变量序列中是用 E$_ENV,所以会出现空的情况,同时并不代表这些环境信息不存在,通过 getenv可以获取到。应该是考虑到安全的因素生产环境默认没有设置$_ENV。通过cli模式看看$_ENV都那些变量

foreach(_ENV ask => v) {
# 隐藏环境变量值 ***
        echok . ' ==> ' . "***" . PHP_EOL;
}
XDG_SESSION_ID ==> ***
HOSTNAME ==> ***
TERM ==> ***
SHELL ==> ***
HISTSIZE ==> ***
SSH_CLIENT ==> ***
SSH_TTY ==> ***
USER ==> ***
LS_COLORS ==> ***
TMUX ==> ***
PATH ==> ***
MAIL ==> ***
PWD ==> ***
EDITOR ==> ***
LANG ==> ***
TMUX_PANE ==> ***
HISTCONTROL ==> ***
SHLVL ==> ***
HOME ==> ***
LOGNAME ==> ***
SSH_CONNECTION ==> ***
LESSOPEN ==> ***
XDG_RUNTIME_DIR ==> ***
_ ==> ***
OLDPWD ==> ***

输出一下 $_ENV的值 (web环境)

USER ==> ***
HOME ==> ***
HTTP_COOKIE ==> ***
HTTP_ACCEPT_LANGUAGE ==> ***
HTTP_ACCEPT_ENCODING ==> ***
HTTP_ACCEPT ==> ***
HTTP_USER_AGENT ==> ***
HTTP_UPGRADE_INSECURE_REQUESTS ==> ***
HTTP_CACHE_CONTROL ==> ***
HTTP_CONNECTION ==> ***
HTTP_HOST ==> ***
REDIRECT_STATUS ==> ***
SERVER_NAME ==> ***
SERVER_PORT ==> ***
SERVER_ADDR ==> ***
REMOTE_PORT ==> ***
REMOTE_ADDR ==> ***
SERVER_SOFTWARE ==> ***
GATEWAY_INTERFACE ==> ***
HTTPS ==> ***
REQUEST_SCHEME ==> ***
SERVER_PROTOCOL ==> ***
DOCUMENT_ROOT ==> ***
DOCUMENT_URI ==> ***
REQUEST_URI ==> ***
SCRIPT_NAME ==> ***
CONTENT_LENGTH ==> ***
CONTENT_TYPE ==> ***
REQUEST_METHOD ==> ***
QUERY_STRING ==> ***
SCRIPT_FILENAME ==> ***
PHP_VALUE ==> ***
FCGI_ROLE ==> ***

留言

您的电子邮箱地址不会被公开。 必填项已用 * 标注