CLI程序开发 - $_SERVER数组会缺斤少量

  • 作者:KK

  • 发表日期:2016.10.14


要点速读

命令行运行PHP并不存在HTTP的概念,所以$_SERVER['HTTP_HOST']等跟HTTP场景有关的数组元素都会不存在,深度开发CLI程序时,你应该注意可以获得哪些元素


正文

在通过网页访问网址触发PHP,我们都能通过$_SERVER['SERVER_PROTOCOL']知道通讯时使用的HTTP协议版本号,还能通过$_SERVER['HTTP_HOST']知道当前的域名

因为这是HTTP请求

可是如果用命令行运行PHP的话以下代码会报错:

echo $_SERVER['SERVER_PROTOCOL'];
echo $_SERVER['HTTP_HOST'];

运行后报错内容如下:

PHP Notice:  Undefined index: SERVER_PROTOCOL in test.php on line 2
PHP Notice:  Undefined index: HTTP_HOST in test.php on line 3

原因是这并非通过HTTP的途径来运行PHP,而是直接在命令行里调用PHP,所以就并不存在HTTP协议版本号域名这种概念

因此完全不需要安装Apache都可以,只是单独解压出PHP程序包,也不需要任何安装工作,直接命令行调用就是了


小结

在深度开发CLI程序时,你应该注意可以获得哪些元素

最典型的情况就是我们经常要的这些元素没有了,我在这里列出来,是提醒你注意一下自己的程序里有没有遗留些内容的读取代码,因为有些CLI程序就是直接复制Web程序的代码企图快速迁移的:

$_SERVER['SERVER_ADDR'];

$_SERVER['HTTP_HOST'];

$_SERVER['REQUEST_URI'];

$_SERVER['QUERY_STRING'];

$_SERVER['SCRIPT_FILENAME'];

$_SERVER['HTTP_USER_AGENT'];

$_SERVER['HTTP_REFERER'];

特别遇到HTTP开头的数组元素时,你就要思考一下你这段程序代码会不会被用在CLI模式下了,否则就给项目埋了个坑


最后,本文的标题其实是不正确的,什么缺斤少量,本质上就是命令行模式下不应有的数据嘛,好像HTTP服务器模式下才是完整的意思?

我只是用这个标题给大家一个深刻印象而已,因为大家几乎都是先接触Web开发,然后再接触CLI开发,所以感觉上就是$_SERVER数组缺少了东西一样