Home  >  Q&A  >  body text

程序员 - 搞不清FastCgi与PHP-fpm之间是个什么样的关系

我在网上查fastcgi与php-fpm的关系,查了快一周了,基本看了个遍,真是众说纷纭,没一个权威性的定义。

网上有的说,fastcgi是一个协议,php-fpm实现了这个协议; 有的说,php-fpm是fastcgi进程的管理器,用来管理fastcgi进程的; 有的说,php-fpm是php内核的一个补丁; 有的说,修改了php.ini配置文件后,没办法平滑重启,所以就诞生了php-fpm; 还有的说PHP-CGI是PHP自带的FastCGI管理器,那这样的话干吗又弄个php-fpm出来,我就更晕了;

发个贴,想听听大家的理解,网上的我都已经看了个遍,因为我查了一周了,哈哈,所以想听听原创的理解。

大家讲道理大家讲道理2723 days ago1600

reply all(22)I'll reply

  • 黄舟

    黄舟2017-04-10 14:31:36

    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.

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

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

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

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

    一般情况下,FastCGI的整个工作流程是这样的:

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

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

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

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

    reply
    0
  • 黄舟

    黄舟2017-04-10 14:31:36

    cgi 就是一个接口,它定义好了自己的输入和输出, php-cgi 则是对这个接口的一种实现, fastcgi 则是对 cgi 实现的一个性能优化版本

    reply
    0
  • 高洛峰

    高洛峰2017-04-10 14:31:36

    fastcgi 是 app server 和web server 之间的通信协议。 正常架构 app server 是master,web server是client

    php-fpm 带两个功能:1.实现了一个支持fastcgi协议的server程序 2. 进程管理器

    有了php-fpm,就可以把php脚本变成 多进程模式采用fastcgi协议的app server,和web server进行通信

    你可以参考 python web 程序的9种部署方式 这篇文字

    reply
    0
  • 大家讲道理

    大家讲道理2017-04-10 14:31:36

    浅谈PHP进程管理

    reply
    0
  • 高洛峰

    高洛峰2017-04-10 14:31:36

    fastcgi是一个协议,没错。php-fpm实现了这个协议,没错。 php-fpm的fastcgi协议需要有个金城吧?php-fpm实现的fastcgi进程就叫php-cgi= =。所以php-fpm就是他自身的fastcgi或php-cgi进程管理器,没错。php-fpm在5.2之前官方是没有php-fpm的。php-fpm是作为一个第三方的补丁你才能用的。5.2之后捏,官方就已经默认加入了,从此就不是一个补丁了。

    ======update:

    参考资料:http://baike.baidu.com/view/4168033.htm
    使用PHP-FPM来控制PHP-CGI的FastCGI进程
    在没有PHP-FPM之前。是直接打开php-cgi.exe(win32)、php-cgi进程来处理fastcgi的请求的。或者是用spawn-fcgi或uwsgi类似的fastcgi进程管理软件。
    php-fpm的目的就是解决spawn-fcgi和uwsgi等类似管理器的缺陷并且集成入PHP官方。
    

    另外纠正:php-fpm是自php5.3以后版本才开始被官方加入的

    reply
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 14:31:36

    CGI => http://www.w3.org/CGI/
    FastCGI => http://www.fastcgi.com/drupal/
    FPM => FastCGI Process Manager(FastCGI进程管理器)
    只能帮你到这里了,同学。

    reply
    0
  • 天蓬老师

    天蓬老师2017-04-10 14:31:36

    那啥,php-fpm是在PHP5.3版本开始默认打包加入的吧。

    1楼的回答比较全面。

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 14:31:36

    添加一篇科普文章:概念了解:CGI,FastCGI,PHP-CGI与PHP-FPM

    reply
    0
  • 黄舟

    黄舟2017-04-10 14:31:36

    一楼写的不错

    reply
    0
  • 巴扎黑

    巴扎黑2017-04-10 14:31:36

    very good.

    reply
    0
  • Cancelreply