我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

本文重新来审视一下phpgetenv()函数,主要分析的是它和$_SERVER/$_ENV的可能关系。从名字上来看,getenv()就是从$_ENV中获取数据。但是,真的是这样的么?

苏南大叔:php的getenv()函数的数据来源,是$_ENV还是$_SERVER? - php-getenv
php的getenv()函数的数据来源,是$_ENV还是$_SERVER?(图5-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码感想感悟。本文测试环境:win10nginx@1.15.11php@8.2.10-nts。当然本文的结论是:getenv()函数的数据来源,既不是$_ENV,也不是$_SERVER。只能说类似,但是确实没有关系。

来自putenv()的数据

这个比较好理解,只不过是putenv()函数的使用方式,有些奇怪罢了。参考代码:

putenv("www=newsn.net");
putenv("name=苏南大叔");
echo getenv("www");
echo getenv("name");

输出:

newsn.net
苏南大叔

苏南大叔:php的getenv()函数的数据来源,是$_ENV还是$_SERVER? - 来源一putenv
php的getenv()函数的数据来源,是$_ENV还是$_SERVER?(图5-2)

相关文章:

来自命令行变量的数据

这种使用方式,虽然可行。但是实际应用中,似乎没看到谁这么使用过。基于windows系统的cmd,测试命令如下:

set www=newsn.net && set name=苏南大叔 && php -S test:8080 -t ./
echo getenv("www");
echo getenv("name");

输出:

newsn.net
苏南大叔

苏南大叔:php的getenv()函数的数据来源,是$_ENV还是$_SERVER? - 来源二命令行服务变量
php的getenv()函数的数据来源,是$_ENV还是$_SERVER?(图5-3)

需要注意的是:不同操作系统下命令行是不一样的,参考文章:

来自$_ENV的数据?

注意:$_ENV里面不一定有数据的,这个与php.ini里面的variables_order设置有关,请以实际情况为准。

测试代码:

echo PHP_VERSION;
var_dump(ini_get("variables_order"));
var_dump($_ENV);
$_ENV["www2"]="newsn.net";
var_dump($_ENV);
var_dump("www2:".getenv("www2"));
var_dump("HTTP_HOST:".getenv("HTTP_HOST"));
$_ENV["HTTP_HOST"]="newsn.net";
var_dump("HTTP_HOST:".getenv("HTTP_HOST"));

苏南大叔:php的getenv()函数的数据来源,是$_ENV还是$_SERVER? - 不来自$_ENV
php的getenv()函数的数据来源,是$_ENV还是$_SERVER?(图5-4)

nginx+php输出:

8.2.10
string(4) "GPCS"
array(0) {
}
array(1) {
  ["www2"]=>
  string(9) "newsn.net"
}
string(5) "www2:"
string(14) "HTTP_HOST:test"
string(14) "HTTP_HOST:test"

php输出:

7.4.29
string(4) "GPCS"
array(0) {
}
array(1) {
  ["www2"]=>
  string(9) "newsn.net"
}
string(5) "www2:"
string(10) "HTTP_HOST:"
string(10) "HTTP_HOST:"

结果表明:getenv()的数据,并不来源于$_ENV

来自$_SERVER的数据?

注意:$_SERVER里面不一定有数据的,这个与php.ini里面的variables_order设置有关,请以实际情况为准。

测试代码:

echo PHP_VERSION;
var_dump(ini_get("variables_order"));
var_dump($_SERVER);
$_SERVER["www2"]="newsn.net";
var_dump($_SERVER);
var_dump("www2:".getenv("www2"));
var_dump("HTTP_HOST:".getenv("HTTP_HOST"));
$_SERVER["HTTP_HOST"]="newsn.net";
var_dump("HTTP_HOST:".getenv("HTTP_HOST"));

苏南大叔:php的getenv()函数的数据来源,是$_ENV还是$_SERVER? - 不来自server变量
php的getenv()函数的数据来源,是$_ENV还是$_SERVER?(图5-5)

nginx+php输出:

8.2.10
string(4) "GPCS"
array(66) {
  // ...
  ["HTTP_HOST"]=>
  string(4) "test"
}
array(67) {
  // ...
  ["HTTP_HOST"]=>
  string(4) "test"
  ["www2"]=>
  string(9) "newsn.net"
}
string(5) "www2:"
string(14) "HTTP_HOST:test"
string(14) "HTTP_HOST:test"

php命令行服务输出:

7.4.29
string(4) "GPCS"
array(22) {
  // ...
  ["HTTP_HOST"]=>
  string(9) "test:8080"
}
array(23) {
  // ...
  ["HTTP_HOST"]=>
  string(9) "test:8080"
  ["www2"]=>
  string(9) "newsn.net"
}
string(5) "www2:"
string(10) "HTTP_HOST:"
string(10) "HTTP_HOST:"

结果表明:getenv()的数据,并不来源于$_SERVER

相关文章

结束语

结论如下:
getenv()的数据来源,目前有两个稳定渠道:一个是putenv(),另外一个是命令行里面传递的全局变量(不同操作环境命令行也不一样)。至于$_ENV$_SERVER,目前认为它和getenv()是平行的关系,可能共同从某个地方获得数据,各走各的独木桥。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   php