1.1、关于CGI和FastCGI的理解
全称是“通用网关接口”,是一种让客户端(web浏览器)与Web服务器(nginx等)程序进行通信(数据传输)的协议。
用来规范web服务器传输到php解释器中的数据类型以及数据格式,包括URL、查询字符串、POST数据、HTTPheader等,也就是为了保证webserver传递过来的数据是标准格式的
1.2.CGI程序的工作原理
1)每次当webserver收到index.php这种类型的动态请求后,会启动对应的CGI程序(PHP的解析器);
2)PHP解析器会解析php.ini配置文件,初始化运行环境,然后处理请求,处理完成后将数据按照CGI规定的格式返回给webserver然后退出进程;
3)最后webserver再把结果返回给浏览器。
1.3.CGI程序的特点
1)高并发时的性能较差:CGI程序的每一次web请求都会有启动和退出过程,也就是最为人诟病的fork-and-execute模式(每次HTTP服务器遇到动态请求时都需要重新启动脚本解析器来解析php.ini,重新载入全部DLL扩展并重初始化全部数据结构,然后把结果返回给HTTP服务器),很明显,这样的接口方式会导致php的性能很差,在处理高并发访问时,几乎是不可用的。2)传统的CGI接口方式安全性较差
3)CGI对php.ini的配置很敏感,在开发和调试的时候相当方便
2.1.什么是FastCGI?
通过CGI程序的工作原理可以看出:CGI程序性能较差,安全性较低,为了解决这些问题产生了FastCGI。
1)FastCGI(FastCommonGatewayInterface)全称是“快速通用网关接口”是通用网关接口(CGI)的增强版本,由CGI发展改进而来,主要用来提高CGI程序性能,类似于CGI,FastCGI也是一种让交互程序与Web服务器通信的协议2)FastCGI致力于减少网页服务器与CGI程序之间互动的开销,从而使服务器可以同时处理更多的网页请求(提高并发访问)。
3)同样的,一般说的FastCGI指的也是用各种语言编写的能实现该功能的程序。
2.2.FastCGI程序的工作原理
1)WebServer启动同时,加载FastCGI进程管理器(nginx的php-fpm或者IIS的ISAPI或Apache的Module)2)FastCGI进程管理器读取php.ini配置文件,对自身进行初始化,启动多个CGI解释器进程(php-cgi),等待来自WebServer的连接。3)当WebServer接收到客户端请求时,FastCGI进程管理器选择并连接到一个CGI解释器。Webserver会将相关环境变量和标准输入发送到FastCGI子进程php-cgi进行处理4)FastCGI子进程完成处理后将数据按照CGI规定的格式返回给WebServer,然后关闭FastCGI子进程或者等待下一次请求。
2.3.FastCGI对进程的管理方式
Fastcgi会先启一个master,解析配置文件,初始化执行环境,然后再启动多个worker。当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然提高。而且当worker不够用时,master可以根据配置预先启动几个worker等着;当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。这就是fastcgi的对进程的管理。
2.4.FastCGI的特点:
1)FastCGI具有语言无关性,支持用大多数语言进行编写,对应的程序也支持大多数主流的web服务器FastCGI技术目前支持语言有:C/C++,Java,PHP,Perl,Tcl,Python,SmallTalk,Ruby等。支持FastCGI技术的主流web服务器有:Apache,Nginx,lig