杂项知识(五)FastCGI

1、CGI的引入

在网站的整体架构中,Web Server(如nginx,apache)只是内容的分发者,对客户端的请求进行应答。

如果客户端请求的是index.html这类静态页面,那么Web Server就去文件系统中找对应的文件,找到返回给客户端(一般是浏览器),在这里Web Server分发的就是静态数据。整个过程如下图:
杂项知识(五)FastCGI
对于像index.php这类动态页面请求,Web Server根据配置文件知道这个不是静态文件,则会调用PHP解析器进行处理然后将返回的数据转发给客户端(浏览器)。整个过程如下图:
杂项知识(五)FastCGI整个过程中,Web Server并不能直接处理静态或者动态请求,对于静态请求是直接查找然后返回数据或者报错信息,对于动态数据则是交给其他工具(PHP解析器)进行处理。

2、什么是CGI

2.1、什么是CGI

(1)CGI全称是 “ 通用网关接口 ”,是一种让客户端(Web浏览器)与Web服务器(nginx等)程序进行通信(数据传输)的协议。

(2)用来规范Web服务器传输到PHP解释器中的数据类型以及数据格式,包括URL、POST数据、HTTP Header等,也就是为了保证Web Server传递过来的数据是标准格式的。

(3)CGI可以用任何一种具有标准输入、输出和环境变量的语言编写,如php,perl等。

(4)一般说的CGI指的是用各种语言编写的能实现该功能的程序。

2.2、CGI工作原理

(1)每次当web server收到index.php这种类型的动态请求后,会启动对应的CGI程序(PHP的解析器);

(2)PHP解析器会解析php.ini配置文件,初始化运行环境,然后处理请求,处理完成后将数据按照CGI规定的格式返回给web server然后退出进程;

(3)最后web server再把结果返回给浏览器。

3、关于FastCGI

3.1、什么是FastCGI

通过CGI程序的工作原理可以看出:CGI程序性能较差,安全性较低,为了解决这些问题产生了FastCGI。
(1)FastCGI(Fast Common Gateway Interface)全称是“快速通用网关接口”
是通用网关接口(CGI)的增强版本,由CGI发展改进而来,主要用来提高CGI程序性能,类似于CGI,FastCGI也是一种让交互程序与Web服务器通信的协议。

(2)FastCGI致力于减少网页服务器与CGI程序之间互动的开销,从而使服务器可以同时处理更多的网页请求(提高并发访问)。

(3)同样的,一般说的FastCGI指的也是用各种语言编写的能实现该功能的程序。

3.2、FastCGI工作原理

(1)Web Server启动同时,加载FastCGI进程管理器(nginx的php-fpm或者IIS的ISAPI或Apache的Module)

(2)FastCGI进程管理器读取php.ini配置文件,对自身进行初始化,启动多个CGI解释器进程(php-cgi),等待来自Web Server的连接。

(3)当Web Server接收到客户端请求时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server会将相关环境变量和标准输入发送到FastCGI子进程php-cgi进行处理

(4)FastCGI子进程完成处理后将数据按照CGI规定的格式返回给Web Server,然后关闭FastCGI子进程或者等待下一次请求。

4、总结

(1)CGI 和 FastCGI 都只是一种通信协议规范,不是一个实体,一般说的CGI指的是用各种语言编写的能实现该功能的程序

(2)CGI 程序和FastCGI程序,是指实现这两个协议的程序,可以是任何语言实现这个协议的。(PHP-CGI 和 PHP-FPM就是实现FastCGI的程序)