上篇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