FastCgi与PHP-fpm之间是个什么样的关系

CGI is an interface which tells the webserver how to pass data back and forth to and from an application. More specifically, it describes how request information is passed in environment variables (such as request type, remote IP address), how the reqeust body is passed in via standard input, and how the response is passed out via standard output.php

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

web server(好比说nginx)只是内容的分发者。好比,若是请求/index.html,那么web server会去文件系统中找到这个文件,发送给浏览器,这里分发的是静态数据。好了,若是如今请求的是/index.php,根据配置文件,nginx知道这个不是静态文件,须要去找PHP解析器来处理,那么他会把这个请求简单处理后交给PHP解析器。Nginx会传哪些数据给PHP解析器呢?url要有吧,查询字符串也得有吧,POST数据也要有,HTTP header不能少吧,好的,CGI就是规定要传哪些数据、以什么样的格式传递给后方处理这个请求的协议。仔细想一想,你在PHP代码中使用的用户从哪里来的。nginx

当web server收到/index.php这个请求后,会启动对应的CGI程序,这里就是PHP的解析器。接下来PHP解析器会解析php.ini文件,初始化执行环境,而后处理请求,再以规定CGI规定的格式返回处理后的结果,退出进程。web server再把结果返回给浏览器。web

好了,CGI是个协议,跟进程什么的不要紧。那fastcgi又是什么呢?Fastcgi是用来提升CGI程序性能的。segmentfault

提升性能,那么CGI程序的性能问题在哪呢?"PHP解析器会解析php.ini文件,初始化执行环境",就是这里了。标准的CGI对每一个请求都会执行这些步骤(不闲累啊!启动进程很累的说!),因此处理每一个时间的时间会比较长。这明显不合理嘛!那么Fastcgi是怎么作的呢?首先,Fastcgi会先启一个master,解析配置文件,初始化执行环境,而后再启动多个worker。当请求过来时,master会传递给一个worker,而后当即能够接受下一个请求。这样就避免了重复的劳动,效率天然是高。并且当worker不够用时,master能够根据配置预先启动几个worker等着;固然空闲worker太多时,也会停掉一些,这样就提升了性能,也节约了资源。这就是fastcgi的对进程的管理。浏览器

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

你们都知道,PHP的解释器是php-cgi。php-cgi只是个CGI程序,他本身自己只能解析请求,返回结果,不会进程管理(皇上,臣妾真的作不到啊!)因此就出现了一些可以调度php-cgi进程的程序,好比说由lighthttpd分离出来的spawn-fcgi。好了PHP-FPM也是这么个东东,在长时间的发展后,逐渐获得了你们的承认(要知道,前几年你们但是抱怨PHP-FPM稳定性太差的),也愈来愈流行。架构

网上有的说,fastcgi是一个协议,php-fpm实现了这个协议app

有的说,php-fpm是fastcgi进程的管理器,用来管理fastcgi进程的ide

对。php-fpm的管理对象是php-cgi。但不能说php-fpm是fastcgi进程的管理器,由于前面说了fastcgi是个协议,彷佛没有这么个进程存在,就算存在php-fpm也管理不了他(至少目前是)。 有的说,php-fpm是php内核的一个补丁

之前是对的。由于最开始的时候php-fpm没有包含在PHP内核里面,要使用这个功能,须要找到与源码版本相同的php-fpm对内核打补丁,而后再编译。后来PHP内核集成了PHP-FPM以后就方便多了,使用--enalbe-fpm这个编译参数便可。

有的说,修改了php.ini配置文件后,没办法平滑重启,因此就诞生了php-fpm

是的,修改php.ini以后,php-cgi进程的确是没办法平滑重启的。php-fpm对此的处理机制是新的worker用新的配置,已经存在的worker处理完手上的活就能够歇着了,经过这种机制来平滑过分。

还有的说:“PHP-CGI是PHP自带的FastCGI管理器,那这样的话干嘛又弄个php-fpm出来”

不对。php-cgi只是解释PHP脚本的程序而已。


FASTCGI:WEB服务器与处理程序之间通讯的一种协议,是CGI的改进方案。

CGI程序反复加载是CGI性能低下的主要缘由,若是CGI程序保持在内存中并接受FastCGI进程管理器调度,则能够提供良好的性能、伸缩性、Fail-Over特性等。

FASTCGI是常驻型的CGI,它能够一直运行,在请求到达时,不会花费时间去fork一个进程来处理。

FastCGI是语言无关的、可伸缩架构的CGI开放扩展,将CGI解释器进程保持在内存中,以此得到较高的性能。

通常状况下,FastCGI的整个工做流程是这样的:

一、Web Server启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module)

二、FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待WebServer的链接。

三、当客户端请求到达Web Server时,FastCGI进程管理器选择并链接到一个CGI解释器。 Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。

四、FastCGI子进程完成处理后将标准输出和错误信息从同一链接返回Web Server。当FastCGI子进程关闭链接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web Server中)的下一个链接。在CGI模式中,php-cgi在此便退出了。

Fastcgi是CGI的升级版,一种语言无关的协议,用来沟通程序(如PHP, Python, Java)和Web服务器(Apache2, Nginx), 理论上任何语言编写的程序均可以经过Fastcgi来提供Web服务。
Fastcgi的特色是会在一个进程中依次完成多个请求,以达到提升效率的目的,大多数Fastcgi实现都会维护一个进程池。

而PHP-fpm就是针对于PHP的,Fastcgi的一种实现,他负责管理一个进程池,来处理来自Web服务器的请求。目前,PHP-fpm是内置于PHP的。

可是PHP-fpm仅仅是个“PHP Fastcgi 进程管理器”, 它仍会调用PHP解释器自己来处理请求,PHP解释器(在Windows下)就是php-cgi.exe.



以上内容查询自 “https://segmentfault.com/q/1010000000256516”

由本人摘录比较好的回答整理成一套知识点,但愿可以帮到你们!

相关文章
相关标签/搜索