面试-PHP篇-CGI、Fastcgi、PHP-FPM的详细介绍与之间的关系

一:CGI是干嘛的?CGI是为了保证web server传递过来的数据是标准格式的

CGI(Common Gateway Interface),公共网关接口,它是Web服务器与外部应用程序(CGI程序)之间传递信息的接口标准。
如请求/index.html,那么web server会去指定目录下找到这个文件(如果存在的话)发送给浏览器,这里分发的是静态数据。那么,请求的是/index.php的时候,根据配置文件,nginx知道这个不是静态文件,需要去找PHP解析器来处理,那么他会把这个请求简单处理后交给PHP解析器。CGI就是规定客户端向web server请求数据的时候,要传哪些数据、以什么样的格式传递的一种协议。
通过CGI接口,Web服务器就能够获取客户端提交的信息,并转交给服务器端的CGI程序处理,最后返回结果给客户端。一般地,我们提到的CGI实际上是实现了CGI接口标准的程序,用来处理客户请求。CGI程序可以用C、perl、php等来编写。

以前,web服务器一般只处理静态的请求,如果碰到一个动态请求,web服务器会根据这次请求的内容,然后fork一个进程启动CGI程序,这里就是指PHP的解析器,PHP解析器程序启动后,它就会解析php.ini文件,初始化执行环境,然后解析动态脚本,再把处理完的数据返回给web服务器,最后web服务器把内容发送给用户,刚才fork的进程也随之退出。 如果下次用户还请求改动态脚本,那么web服务器又再次fork一个新的子进程启动CGI程序,周而复始的进行。启动CGI程序需要读取配置文件、加载相关扩展等,这样的工作效率非常低下。

二:CGI是个协议,跟进程什么的没关系;那fastcgi又是什么呢?Fastcgi是用来提高CGI程序性能的

提高性能,那么CGI程序的性能问题在哪呢?"PHP解析器会解析php.ini文件,初始化执行环境",就是这里了。标准的CGI对每个请求都会执行这些步骤,所以处理

          每个时间的时间会比较长。这明显不合理嘛!那么Fastcgi是怎么做的呢?首先,Fastcgi会先启一个master,解析配置文件,初始化执行环境,然后再启动多个worker。

          当请求过时,master会传递给一个worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然是高。而且当worker不够用时,master可以根据配置预

          先启动几个worker等着;当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。这就是fastcgi的对进程的管理。

(1)FastCGI是一种进程管理工具,它可以在内存中管理CGI进程。
(2)FastCGI就像是一个常驻(long-live)型的CGI程序,它可以一直运行着。
(3)FastCGI程序也可以和Web服务器分别部署在不同的主机上,它还可以接受来自其他Web服务器的请求。
(4)FastCGI也是语言无关的。其主要行为是将CGI解释器进程保持在内存中并因此获得高效的性能。
(5)FastCGI进程管理器需要单独启动。启动FastCGI后,会生成一个FastCGI主进程和多个子进程(子进程其实就是CGI解释器进程)。
(6)当客户端请求Web服务器上的动态脚本时,Web服务器会将动态脚本通过TCP协议交给FastCGI主进程,FastCGI主进程根据情况,安排一个空闲的子进程来解析动态脚本,处理完成后将结果返回给Web服务器,Web服务器再将结果返回给客户端。该客户端请求处理完毕后,FastCGI子进程并不会随之关闭,而是继续等待主进程安排工作任务。
 

三:那PHP-FPM又是什么呢?是一个实现了Fastcgi的程序,被PHP官方收了

PHP-FPM(FastCGI Process Manager:FastCGI进程管理器)是一个实现了Fastcgi的程序,并且提供进程管理的功能,被PHP官方收了。
php-fpm就是php中的FastCGI进程管理器。进程包括master进程和worker进程。master进程只有一个,负责管理子进程(worker进程一般会有多个,每个进程中会嵌入一个PHP解析器,处理PHP代码。
如果在Linux上搭建Nginx和PHP环境,则需要安装PHP-FPM模块,让php以FastCGI的方式与nginx进行交互。
 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章