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数组缺少了东西一样