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环境的输出
可以看到没有区别。(至少两个变量的$key是没有区别的)
shell环境的输出
可以看到以下的区别
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 ==> ***