上篇http服务器究竟做了什么(一)提到http服务器会有接口让第三方程序来接入,从而实现业务分离的作用.接口肯定有接口的规范,例如我国家用插座输出电压规范是220v,厂商都是根据这个规范来生产家电的.那么http服务器接口的规范是什么呢?他有有个专有名词:Common Gateway Interface(通用网关接口),简称CGI.
服务器与CGI主要通过标准输入输出来通信和交互.CGI本质上是一种特定的程序, CGI的一个目的是要独立于任何语言的,所以CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。 如php,perl,tcl等。下图描述了CGI与服务器的关系:
可以看出,进程的标准输入输出是他们通信的桥梁,环境变量是运输工具.对于CGI程序来说,它继承了系统的环境变量。CGI环境变量在CGI程序启动时初始化,在结束时销毁。当一个CGI程序不是被HTTP服务器调用时,它的环境变量几乎是系统环境变量的复制。当这个CGI程序被HTTP服务器调用时(一般是他的子进程,即fork出来的),它的环境变量就会多了以下关于HTTP服务器、客户端、CGI传输过程等项目。有哪些环境变量呢?按照分类如下:
与请求相关的环境变量 | REQUEST_METHOD | 服务器与CGI程序之间的信息传输方式 |
QUERY_STRING | 采用GET时所传输的信息 | |
CONTENT_LENGTH | STDIO中的有效信息长度 | |
CONTENT_TYPE | 指示所传来的信息的MIME类型 | |
CONTENT_FILE | 使用Windows HTTPd/WinCGI标准时,用来传送数据的文件名 | |
PATH_INFO | 路径信息 | |
PATH_TRANSLATED | CGI程序的完整路径名 | |
SCRIPT_NAME | 所调用的CGI程序的名字 | |
与服务器相关的环境变量 | GATEWAY_INTERFACE | 服务器所实现的CGI版本 |
SERVER_NAME | 服务器的IP或名字 | |
SERVER_PORT | 主机的端口号 | |
SERVER_SOFTWARE | 调用CGI程序的HTTP服务器的名称和版本号 | |
与客户端相关的环境变量 | REMOTE_ADDR | 客户机的主机名 |
REMOTE_HOST | 客户机的IP地址 | |
ACCEPT | 例出能被次请求接受的应答方式 | |
ACCEPT_ENCODING | 列出客户机支持的编码方式 | |
ACCEPT_LANGUAGE | 表明客户机可接受语言的ISO代码 | |
AUTORIZATION | 表明被证实了的用户 | |
FORM | 列出客户机的EMAIL地址 | |
IF_MODIFIED_SINGCE | 当用get方式请求并且只有当文档比指定日期更早时才返回数据 | |
PRAGMA | 设定将来要用到的服务器代理 | |
REFFERER | 指出连接到当前文档的文档的URL | |
USER_AGENT | 客户端浏览器的信息 |
前面提到,浏览器与服务器是通过http协议通信的.服务器收到浏览器请求后会启用CGI程序,根据不同的业务请求来写入不同的环境变量.例如GET和POST请求,服务器会向CGI程序的REQUEST_METHOD环境变量写入不同的值,分别为'GET','POST'.关于浏览器的GET和POST请求后面还会提到.
等CGI程序处理请求之后,就要向服务器返回结果数据了,他们仍然是通过标准输入输出来进行的.服务器再把数据发送给浏览器,我们就得到请求结果了.
Talk is cheap, show me the code. 接下来的一篇通过程序实例来说明上面的过程.
参考资料:
1 http://www.php-internals.com/book/?p=chapt02/02-02-03-fastcgi
2 https://blog.csdn.net/liunian_siyu/article/details/60964966
3 http://www.cnblogs.com/liuzhang/p/3929198.html