CGI、FastCGI、php-fpm、nginx、php之间的关系、区别、原理

1.CGI

是什么

CGI(Common Gateway Interface)全称是“通用网关接口”,WEB 服务器与运行其上的应用程序进行“交谈”的一种工具,其程序须运行在网络服务器上。CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。如php、perl、tcl等。

CGI是Web服务器和一个独立的进程之间的协议,它会把HTTP请求Request的Header头设置成进程的环境变量,HTTP请求的Body正文设置成进程的标准输入,进程的标准输出设置为HTTP响应Response,包含Header头和Body正文

CGI是为了保证web server传递过来的数据是标准格式的,方便CGI程序的编写者。

做什么

Web服务器(如nginx)一般只用来处理静态文件请求,一旦碰到动态脚本请求,Web服务器主进程就会Fork创建出一个新的进程来启动CGI程序(PHP解析器php-cgi),也就是将动态脚本交给CGI程序(php-cgi)来处理。启动CGI程序需要一个过程,如读取配置文件、加载扩展等。当CGI程序启动后会去解析动态脚本,然后将结果返回给Web服务器,最后由Web服务器将结果返回给客户端,之前Fork出来的进程也随之关闭。这样,每次用户请求动态脚本,Web服务器都要重新Fork创建一个新进程去启动CGI程序,由CGI程序来处理动态脚本,处理完成后进程随之关闭,其效率是非常低下的。

参考资料:
https://www.jianshu.com/p/c4dc22699a42
https://blog.csdn.net/u010785091/article/details/78705690

PHP-CGI

是什么

3由上面我们可知CGI只是一种协议,那到底谁来执行php代码呢?答案是php-cgi。
php-cgi是php提供给web 服务器(nginx)的cgi协议接口程序,php-cgi是CGI协议的实现,php-cgi它实现了CGI协议标准的输入输出。

网上有些码友说php-cgi是一个进程管理,用来创建子进程去执行代码的,也有人说php-cgi是php解释器,这2中说法,我也懵逼…不知道哪个正确的

做什么

Web服务器(nginx)在收到请求(index.php?a=1)后,会根据nginx vhost配置文件,将所有.php结尾的请求都转发给php-cgi,此时nginx会根据CGI协议,将一些http请求上的参数 转换成 CGI标准的输入(POST参数可从STDIN中获取)、环境变量(GET请求的参数会存在环境变量QUERY-STRING里),一并传给php-cgi程序。php-cgi接受到转发请求后会启动一次子进程,php-cgi进程启动时,先要重载配置,数据结构以及初始化ZE运行环境。接着解释执行对应的代码。最后,代码执行完后,得到的结果以CGI标准的输出(STDOUT)格式返回 给nginx,nginx将结果转换成http协议,并将结果放置到 response。Php-cgi的子进程会关闭释放。用户每次请求,会创建一个子进程,而子进程每次都需要重复的加载配置文件、初始化允许环境、连接服务等,并发一上来就非常耗资源和内存。
参考:
http://www.360doc.com/content/14/0822/13/15740073_403803712.shtml
https://blog.csdn.net/weixin_39672011/article/details/115134634

2.FastCGI

是什么

FastCGI是Web服务器和处理程序之间通信的一种协议, 是CGI的一种改进方案,FastCGI像是一个常驻(long-lived)型的CGI, 它可以一直执行,在请求到达时不会花费时间去fork一个进程来处理(这是CGI最为人诟病的fork-and-execute模式)。 正是因为他只是一个通信协议,它还支持分布式的运算,所以 FastCGI 程序可以在网站服务器以外的主机上执行,并且可以接受来自其它网站服务器的请求。

FastCGI 是一种协议,基于这个协议的程序称作FastCGI程序(IIS ISAPI或Apache Module,php-fpm等)

做什么

FastCGI 程序工作流程如下:

  1. Web Server启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module,php-fpm)
  2. FastCGI进程管理器(php-fpm)自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待来自Web Server的连接。
  3. 当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。
  4. FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。在CGI模式中,php-cgi在此便退出了。
    所以fast-cgi模式下,一个客户端进行一次web服务器请求的流程为:
    客户端---->web服务器---->fast-cgi进程管理器—>cgi解释器—>应用程序。

参考:
https://blog.csdn.net/zhang197093/article/details/78914509
https://blog.csdn.net/zhanghuiqi205/article/details/86519549

3.php-fpm

是什么

php-fpm即php-Fastcgi Process Manager.
php-fpm是 根据FastCGI协议的实现一个程序,并提供了进程管理的功能。php-fpm启动是会创建一个master 进程,master负责CGI的初始化、php环境的初始化、和事件监听等操作,同时根据配置文件监听9000端口。接着master会fork多个worker子进程,worker 进程一般有多个(具体数量根据实际需要配置),并且每个子进程内部都嵌入了一个 PHP 解释器(php-cgi),是 PHP 代码真正执行的地方。

做什么

master进程负责CGI初始化、PHP环境的初始化、workder进程的管理、事件监听操作、定时器。

worker进程负责请求的处理功能:接收,处理,返回。在worker进程处理请求时,无需再次初始化PHP运行环境,

从 php-fpm 接收到请求,到处理完毕,其具体的流程如下:
用户发送请求,web服务器(nginx)接受到请求,通过Fastcgi协议,将http请求数据(get、post、header)封装,转发给监听9000端口的worker进程,worker进程接受、处理,并也按照fastcgi协议标准输出,nginx将结果返回客户端。大致的流程就是这样的。网上有部分说发,是nginx请求转发给master进程,然后由master进程分配给worker进程,个人认为这个说发是不正确的。上面说了master进程只负责 CGI初始化、PHP环境的初始化、workder进程的管理、事件监听。

参考:
https://www.pianshen.com/article/6153417984/
https://www.jianshu.com/p/578cf2e4892e

4.nginx

待完善

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值