浅析CGI、FastCGI、php-fpm概念

一、CGI

1、定义:

CGI:common gateway interface、公共网关接口;
它是Web服务器与外部应用程序(CGI程序)之间传递信息的接口标准;
通过CGI接口,Web服务器就能够获取客户端提交的信息,并转交给服务器端的CGI程序处理,最后返回结果给客户端;

2、描述:

Web Server (如:nginx)接收请求:
如果请求/index.html,根据nginx的配置这里分发的是静态数据,那么nginx会去文件系统中找到这个文件,发送给浏览器;
如果请求的是/index.php,那么ngixn知道这不是静态文件,需要启动一个CGI程序即php解析器,nginx会将请求的url、post数据、header数据按照CGI协议交给php解析器,接下来php解析器会php.ini文件、初始化环境,然后处理请求将处理完的数据返回给nginx,nginx把数据发送给用户,启动的CGI进程随之退出;
如果下次用户还请求改动态脚本,那么web服务器又再次fork一个新的子进程启动CGI程序,周而复始的进行。启动CGI程序需要读取配置文件、加载相关扩展等,这样的工作效率非常低下

3、流程图


image.png

二、FastCGI

1、定义:

是一个常驻(long-live)型的CGI程序

2、描述:

FastCGI是一种进程管理器,在内存中管理着CGI进程;
启动FastCGI会生成一个FastCGI主进程和多个子CGI进程;

4、流程:

Web Server启动时载入FastCGI进程管理器;
FastCGI进程管理器自身初始化,启动多个CGI解释器进程(php-cgi),并等待来自Web Server的连接;
当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi;
FastCGI子进程完成处理后,将标准输出和错误信息从同一连接返回Web Server,当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待,并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。 在CGI模式中,php-cgi在此便退出了
image.png

3、CGI与FastCGI对比

FastCGI就像是一个常驻(long-live)型的CGI程序,它可以一直运行着;
FastCGI也是语言无关的。其主要行为是将CGI解释器进程保持在内存中并因此获得高效的性能;

三、php-fpm

1、定义:

php-cgi:PHP的解释器是php-cgi。php-cgi只是PHP开启的一个CGI程序
PHP FastCGI Process Manager:是php的FastCGI进程管理器的简称

2、描述:

PHP的解释器是php-cgi。php-cgi只是个CGI程序,他自己本身只能解析请求,返回结果,不会管理进程,所以就出现了一些能够调度php-cgi进程的程序,比如说由lighthttpd分离出来的spawn-fcgi。而php-fpm也是这么个东西;
php-fpm的管理对象是php-cgi,但不能说php-fpm是FastCGI进程的管理器,因为前面说了FastCGI是个协议,似乎没有这么个进程存在,就算存在php-fpm也管理不了他(至少目前是)。他负责管理一个进程池,来处理来自Web服务器的请求
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。