CGI、FastCGI和PHP-FPM浅析

  这段时间对Nginx+PHP-FPM的概念和机制一直不太清晰,趁着同事的分享和看过的几篇博文和资料,重新将思路处理一下。

  首先,PHP-FPM(FastCGI Process Manager: FastCGI进程管理器)是一种针对PHP的FastCGI,针对PHP语言的一种进程管理器。FastCGI顾名思义就是一种快速的CGI(Common Gateway Interface)。因此为了能够理解PHP-FPM,我们首先应该了解CGI是怎么样一个机制。

  1   CGI(Common Gateway Interface)

  CGI(通用网关接口)是架起服务器Web Server和处理来自客户端请求的程序之间沟通的桥梁,也就是说是一个第三方的协议规定。当服务器接收到用户端的请求是静态请求时,Web Server会去对应的文件系统中找到这个文件,然后发送给浏览器。但是如果用户的请求是一种动态的请求,Web Server (如Nginx)就不知道如何处理这个请求了,既然自己不知道如何处理,就要求助或者说是承包给第三方。但是交给第三方处理这个请求的时候,总得告诉第三方一些请求的参数吧,这就像软件领域的需求的对接一样,规定我给你什么输入,然后你给我什么输出结果,CGI就是这种约定,规定了输入的参数和出输出的结果的一种协议。在处理动态请求的情况下,其流程图如下:

图1 CGI对请求处理流程图

  用文字描述如下:

  1.用户通过Http将动态请求发送到Web Server;

  2.Web Server通过使用unix domain socket,或者ip socket将请求转发给CGI(如果使用ip socket的话,允许将Web Server 和CGI部署在不同的机器上);

  3.CGI fork一个对应的进程处理来自客户端的动态请求,得到执行的结果;

  4.执行的结果经过同一个socket连接通过CGI返回给Web server;

  5.有Web Server将数据发送个客户端;

  也就是说在这个过程中Web Server只是负责执行静态页面的请求以及接受用户的请求动态请求并转发给相应的处理程序,然后将动态请求处理程序的结果返回给客户端。这可以减轻Web Server的工作负担,使得Web Serve能够在更高并发的请求环境中工作。

  2   FastCGI的工作方式

  CGI虽然提供了Web Server和请求处理程序之间的一种接口规范,但是却饱受诟病。如上图所示,其原因在于CGI是以一种按需派生的方式工作的,也就是说在接收到Web Server转发的请求之后,就需要重新fork一个进程处理来自客户端的请求,但是fork一个进程的代价一般比较昂贵。在并发性不是很高的情况下,这种工作方式也许能工作的很好,但是如果并发性很高就会导致频繁的fork进程并处理请求,给运行CGI的机器造成很大的压力。其实仔细分析fork进程(如图3所示)所发生的事情可以清晰地看到有一些步骤是重复进行的,因此这些步骤是可以省略掉的,因此就诞生了FastCGI。FastCGI是在CGI的架构思想的扩展,其核心思想在于在Web Server和CGI之间建立起一个智能的可持续的中间层用于统筹CGI程序的管理,因此FastCGI可以被看做是一个CGI的进程管理器。其工作流程图如下:

图2 FastCGI对请求的处理流程图

  其中的Fastcig-wrapper可以理解为用于启动另一个程序的程序。FastCGI的工作流程如下所述:

  1.FastCGI进程管理器执行自身的初始化,启动多个worker进程并等待来自Web Server的连接,其中启动FastCGI进程的时候可以配置以ip socket和unix domain socket两种方式启动;

  2.当客户端请求到达Web Server的时候,Web Server将请求采用ip socket或者unix domain socket发送到FastCGI的主进程(也叫master进程),master进程选择连接到一个worker进程。Web服务器将CGI的环境变量和标准输入发送到worker进程;

  3.worker进程处理完成之后将输出通过同一个Socekt连接发送会Web Server。当worker进程处理完请求之后,关闭socket连接。如果没有达到该进程处理的请求数为其设置的上限,则继续存在而不会消亡,等待下次的处理请求。

  3   CGI和FastCGI的不同之处

  为了清晰地说明CGI和FastCGI之间的不同,图3说明了FastCGI和CGI之间的执行步骤的不同之处。图中Individual Request代表着FastCGI的请求处理流程图,而PHP Lifespan很明显就代表着CGI处理请求的流程图。从图中可以看出相对于CGI而言FastCGI处理外部的动态请求时不用为每个请求执行PHP的MINIT(即PHP的模块初始化过程,需要加载php.ini,为php启动的第一个步骤)过程。之所以会出现这种情况,究其原因在于worker进程启动的时候这个步骤已经完成了,worker进程是常驻内存的且不止可以处理一次请求,因此只需要针对特定的请求初始化(RINIT)就可以了,也就是说不用对每次请求都加载一次php.ini。在处理完本次请求之后,如果没有到达处理请求的上限该进程也不用消亡,也就没有了后面的扩展关闭步骤。但是CGI的执行模式是为每个请求fork一个子进程,每个子进程都是重新加载配置文件,按照php执行的步骤按部就班的执行,这也就造成了直接使用CGI的代价昂贵,尤其是在高并发的情况下。

图2 CGI和FastCGI声明周期示意图

  4.   PHP FastCGI---PHP-FPM的架构实现

  PHP-FPM的进程管理方式为:存在的master进程可以管理多个pool,每个pool由master进程监听不同的端口,每个pool中又可以存在许多不同的worker进程。每个worker进程都常驻内存,并且随着请求数量的增多可以动态的增加,就是所谓的prefork动态增加;且每个worker进程都在达到最大的处理请求之后会自动重启,如果进程没有达到最大的请求数量而意外挂掉,则master会重启该worker进程。

  虽然,worker进程的数量可以随着请求数量的增加predork动态增加,但是由于资源的有限,worker进程的数量存在一个上限---pm.max_children,达到这个上限之后,如果还有额外的请求且worker进程都处于繁忙状态,那么该请求会被master进程挂起到连接队列backlog中(默认值为511)。  

  在项目中Nginx和PHP-FPM是一种很好的解耦方式,Nginx的优势之处在于处理高并发,所有的静态界面的处理都由Nginx处理;而PHP-FPM专注于处理php请求,每个请求对应一个php的页面,这样实现了动态界面和静态界面处理的分离,减轻了Nignx的负担。  

  5.   总结

  这篇文章对CGI和FastCGI的工作方式简单的介绍,并对二者的工作方式做了简要的对比,FastCGI由于worker进程常驻内存,能够很大程度上提高并发性。最后对采用FastCGI的PHP-FPM做了简要的介绍。

时间: 2024-10-11 16:36:39

CGI、FastCGI和PHP-FPM浅析的相关文章

什么是CGI FastCGI PHP-CGI PHP-FPM Spawn-CGI?它们之间的关系

1. CGI: Common Gateway Interface外部应用程序: CGI是外部应用程序(CGI程序)与Web服务器之间的接口标准,是在CGI程序和Web服务器之间传递信息的规程.CGI规范允许Web服务器执行外部程序,并将它们的输出发送给Web浏览器.能够让用户访问某种特定动态资源(例*.cgi)时,触发web服务器,让web服务器根据CGI协议调用额外的应用程序(或进程)来执行这段动态程序,将这段动态程序格式化成html的代码再返回给web服务器.它就是让WEB服务器跟应用程序服

CGI,FastCGI,php-cgi,php-fpm的关系

参考自http://segmentfault.com/q/1010000000256516 首先,CGI是干嘛的?CGI是为了保证web server传递过来的数据是标准格式的,方便CGI程序的编写者. web server(比如说nginx)只是内容的分发者.比如,如果请求/index.html,那么web server会去文件系统中找到这个文件,发送给浏览器,这里分发的是静态数据.好了,如果现在请求的是/index.php,根据配置文件,nginx知道这个不是静态文件,需要去找PHP解析器来

[转] Nginx + CGI/FastCGI + C/Cpp

接着上篇<Nginx安装与使用>,本篇介绍CGI/FASTCGI的原理.及如何使用C/C++编写简单的CGI/FastCGI,最后将CGI/FASTCGI部署到nginx.内容大纲如下: 1.     CGI 1.1.     环境变量 1.2.     标准输入 2.     FastCGI 3. nginx cgi/fastcgi 3.1. nginx + fastcgi 3.1.1. spawn-fcgi 3.1.2. 编写fastcgi应用程序 3.1.3. nginx fastcgi

PHP运行模式(cgi,fast-cgi,cli, ISAPI ,web模块模式)【转载】

PHP运行模式有5钟: 1)cgi 通用网关接口(Common Gateway Interface))2)fast-cgi 常驻 (long-live) 型的 CGI3)cli  命令行运行   (Command Line Interface) 4)ISAPI模式(Windows中使用的) 5)web模块模式 (apache等web服务器运行的模块模式) 1.  CGI(Common Gateway Interface) CGI即通用网关接口(Common Gateway Interface),

Nginx + CGI/FastCGI + C/Cpp

http://www.cnblogs.com/skynet/p/4173450.html Nginx + CGI/FastCGI + C/Cpp 2014-12-19 11:05 by 吴秦, 19794 阅读, 6 评论, 收藏, 编辑 接着上篇<Nginx安装与使用>,本篇介绍CGI/FASTCGI的原理.及如何使用C/C++编写简单的CGI/FastCGI,最后将CGI/FASTCGI部署到nginx.内容大纲如下: 1.     CGI 1.1.     环境变量 1.2.     标

cgi fastcgi php-cgi php-fpm

cgi  fastcgi  php-cgi  php-fpm 详解 参考: 摘至:http://www.cnblogs.com/thinksasa/p/4497567.html 详说fastcgi,php-fpm的区别:http://segmentfault.com/q/1010000000256516 注:只为个人收藏积累用 什么是CGI.FastCGI.PHP-CGI.PHP-FPM.Spawn-FCGI?:http://www.mike.org.cn/articles/what-is-cg

Web服务器和动态语言如何交互--CGI&amp;FastCGI&amp;FPM浅谈

一个用户的Request是如何经过Web服务器(Apache,Nginx,IIS,Light)与后端的动态语言(如PHP等)进行交互并将结果返回给用户的呢? 本文浅谈个人观点,可能有误,欢迎拍砖,共同学习. 一. 首先明确几个概念,以便后续说明 CGI:(Common Gateway Interface)Http服务器与后端程序(如PHP)进行交互的中间层. 工作原理及处理方式(fork-and-execute模式): 1.当Web Server有Request到达 2.fork一个CGI进程或

CGI FastCGI WSGI 解析

我们将服务端程序分为了web服务器和应用程序服务器. web服务器是用于处理HTML文件,让客户可以通过浏览器进行访问.主流的有apache,IIS,nginx,lghttpd等. 应用服务器处理业务逻辑,比如使用python的django,flask写成的程序 通常来自客户端浏览器的请求被web服务器截获,如果是静态请求,则如nginx会自己做处理,如果是动态请求,则会抛给后端应用服务器来处理.于是如何在web服务器与应用服务器之间进行通信成了主要问题,这就引出了以下三种处理的接口:CGI,F

CGI,FastCGI,PHP-CGI,PHP-FPM,Spawn-FCGI

CGI CGI, Common Gateway Interface, is a tool for HTTP server to contact with programs on other servers, which can be used into any languages with standard input, standard output and environmental variables, such as PHP, Perl, or Tcl. FastCGI FastCGI 

漫谈CGI FastCGI WSGI

CGI(Common Gateway Interface) 最初,CGI 是在 1993 年由美国国家超级电脑应用中心(NCSA)为 NCSA HTTPd Web 服务器开发的. 这个 Web 服务器使用了 UNIX shell 环境变量 来保存从 Web 服务器传递出去的参数,然后生成一个运行 CGI 的独立进程.CGI的第一个实现是 Perl 写的 1. 效率低下:每一个连接 fork 一个进程处理. 功能十分有限:CGI只能收到一个请求,输出一个响应.很难在CGI体系去对Web请求的控制,