首页 > 代码库 > CGI概念

CGI概念

CGI(通用网关接口,Common Gateway Interface)

CGI是Web服务器与请求处理程序之间传输数据的一种标准,保证Web服务器传递过来的数据是标准格式的,其程序须运行在网络服务器上。
CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。
工作原理:
每当客户请求CGI的时候,WEB服务器就请求操作系统生成一个新的CGI解释器进程(如:PHP-CGI),当CGI满足要求后,WEB服务器就杀死这个进程。
Web服务器(如:Nginx)只是内容的分发者,如果请求/index.html,Web服务器会去文件系统中找到这个文件,发送给浏览器,这里分发的是静态数据。
如果现在请求的是/index.php,根据配置文件,Nginx知道这个不是静态文件,他会把这个请求简单处理后交给PHP解释器。
Nginx会传哪些数据给PHP解释器呢?url,查询字符串,POST数据,HTTP header等,CGI就是规定要传哪些数据、以什么样的格式传递给后方处理这个请求的协议。
当Web服务器收到/index.php这个请求后,会启动对应的CGI程序,这里就是PHP的解释器。
接下来PHP解释器会解析php.ini文件,初始化执行环境,然后处理请求,再以规定CGI规定的格式返回处理后的结果,退出进程。Web服务器再把结果返回给浏览器。

FastCGI(快速通用网关接口,Fast Common Gateway Interface)

FastCGI是Web服务器与请求处理程序之间传输数据的一种标准,是CGI的增强版本,用来减少网页服务器与CGI程序之间互动的开销,从而使服务器可以同时处理更多的网页请求。
FastCGI像是一个常驻(long-live)型的CGI,只要激活后,它可以一直执行着。
FastCGI支持分布式的运算,程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。
FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并提供良好的性能、伸缩性、 Fail-Over特性等等。
FastCGI在进程中的应用程序,不依赖于任何Web服务器的内部架构,独立于核心Web服务器运行,即使服务器技术的变化,FastCGI依然稳定不变。
工作原理:
Web服务器启动时载入FastCGI进程管理器(如:Apache Module)
FastCGI进程管理器自身初始化,启动多个CGI解释器进程(多个php-cgi)并等待来自Web服务器的连接
当客户端请求到达Web服务器时,FastCGI进程管理器选择并连接到一个CGI解释器。Web服务器将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。
FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web服务器。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web服务器中)的下一个连接。在CGI模式中,php-cgi在此便退出了。
在上述情况中,你可以想象CGI通常有多慢。每一个Web请求PHP都必须重新解析php.ini、重新载入全部扩展并重初始化全部数据结构。
使用FastCGI,所有这些都只在进程启动时发生一次。

PHP-CGI(PHP通用网关接口,FastCGI Process Manager)

PHP-CGI是PHP的解释器,是PHP自带的FastCGI管理器。不支持平滑重启

PHP-FPM(PHP Fastcgi进程管理器,FastCGI Process Manager)

PHP-FPM调用PHP解释器(PHP-CGI)进程来处理请求,实现了Fastcgi协议,已被PHP官方收录
PHP-FPM控制的进程cpu回收的速度比较慢,内存分配均匀,有效控制内存和进程
PHP-FPM的配置在php-fpm.ini文件里,可以通过php/sbin/php-fpm进行启动、关闭,支持平滑重启,在./configure的时候带–enable-fpm参数即可开启PHP-FPM

CGI概念