面试中可能经常会被问及fpm或者fastcgi的问题,这里整理一下相关概念及问题
1.什么是cgi
俗称通用网关接口(common gateway interface)
我的理解就是服务器进程通过操作系统和客户端(一般为浏览器)进行通讯的一套标准。
一开始的web服务器只处理静态请求,将一些静态文件按照请求类型发送给浏览器,但是之后增加了动态请求,请求的内容是一个程序(或者脚本),程序处理之后的结果像文件一样发送给浏览器. CGI就是这样一套规定了接受或者发送信息规范的标准.只要满足了这个标准的程序就叫做CGI程序,他与语言无关(任何语言实现都可以),与WEB服务器也无关(任何特定的web服务器都可以执行)
如上图所示,我们编写的代码(无论任何语言)都需要符合CGI的规范才可以正常实现客户端和服务器端的通讯。没有实质的东西,只是一个规范。
2.什么是php-cgi
如上所示,php中符合cgi规范的执行文件
3.什么fast-cgi
传统的CGI模式下,客户端每一次请求服务器都会去外部新fork一个进程来运行程序,再将运行结果返回给客户端。此时新fork的进程就退出,也就是每一次请求都会fork一个进程周而复始。
这样会带来两个问题 1.一般来讲,操作系统的进程数量是有限的,当qps足够大的时候,会严重影响服务器性能。 2. 系统进程的fork和exit开销是巨大的,即使没有达到服务器进程上限,频繁的进程开启关闭也会严重影响服务器性能
所以引入了fast-cgi模式.该模式下每次会拉起一批进程,而这批进程由一个manage进程管理,manage进程不做任何事情,只负责管理这批进程(工作进程),每当有动态请求进来时,manage进程会分配工作进程去解析请求,然后将结果返回给web服务器,当解析完毕后,工作进程不会退出,而是会归还到之前的工作进程池中.下面引用<<深入理解php内核>>中的一段解释加深理解
如上所述,manage进程就是fastcgi进程管理器,他的职责只负责转发来自web服务器的请求和拉起工作进程(CGI解析器)
这也是一个非常经典的多进程模型,在很多场景(例如swoole)中都有使用.这样就很好的解决了性能问题,在并发较高的场景下也没有问题
这里提一句,java是直接使用的多线程来解决,由于php多线程模型出现的很晚,所以一直都是采用此类多进程模型来解决问题
4.什么是fpm
fpm也就是php-fpm,就是实现了fast-cgi的软件,原本是开源软件,被官方收编的。一般是和nginx配合使用,也就是通常的 nginx+php-fpm的架构,由nginx作为web服务器,动态内容反向代理给fpm来处理
网友评论