V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Nagisa1992
V2EX  ›  PHP

关于 PHP -cgi 和 PHP -fpm 的一个困惑

  •  
  •   Nagisa1992 · 2017-08-18 09:57:01 +08:00 · 4742 次点击
    这是一个创建于 2636 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我之前一直理解是 php-cgi 是 php 程序的解释器,而 php-fpm 是 php-cgi 的进程管理器,负责调度 php-cgi 进程解释 php。
    但是今天又看到一个说法,说在 php5.4 之前才是这样,php5.4 之后 php-cgi 和 php-fpm 就没有关系了,php-fpm 既是管理器又是解释器,而 php-cgi 已经废弃了没什么人用了,可是我在我 php5.6 的 mac 上查看进程却依然还是有 php-cgi 的进程。所以 php-cgi 现在到底是一个什么样的存在? php-cgi 和 php-fpm 到底是什么关系? php-fpm 管理的到底是 php 还是 php-cgi ?

    参考: https://www.zhihu.com/question/55835080/answer/146775419
    以及 https://zhuanlan.zhihu.com/p/20694204 这篇文章下面的评论第二页
    17 条回复    2018-11-08 12:19:24 +08:00
    gouchaoer
        1
    gouchaoer  
       2017-08-18 10:08:36 +08:00 via Android   ❤️ 1
    php-cgi 是 php-fpm 中使用的 php 解释器,对应 php 为 php-cli 的解释器,二者默认加载扩展不太一样。。。你在一台安装 php 的机器上试试就知道了
    Zzzzzzzzz
        2
    Zzzzzzzzz  
       2017-08-18 10:28:16 +08:00
    没关系

    早先 php-cgi 就是拿来跑 php 写的 cgi 脚本的解释器, 后来 lighttpd 出了个 spawn-fcgi, 通过调度 cgi 解释器实现 fcgi 机制, 当时这个主要拿来给 ruby 用的, 但是托管 php-cgi 也行.

    之后就出了 fpm, fpm 和 php-cgi 之间的关系是一开始 fpm 作为第三方模块的安装方式是给 php-cgi 模块打 patch, 后来合并进官方就成了独立的模块.
    Nagisa1992
        3
    Nagisa1992  
    OP
       2017-08-18 10:44:54 +08:00
    @gouchaoer 明白了,原来是有两个解释器啊。那意思是现在的 php 虽然用的是 php-fpm 管理和解释,但 fpm 内部调用的还是 php-cgi 对吗?
    Nagisa1992
        4
    Nagisa1992  
    OP
       2017-08-18 10:46:33 +08:00
    @Zzzzzzzzz 那成了独立模块之后 php-fpm 管理和调度的到底是什么呢?
    torbrowserbridge
        5
    torbrowserbridge  
       2017-08-18 10:47:57 +08:00 via Android
    @Nagisa1992 不对,
    torbrowserbridge
        6
    torbrowserbridge  
       2017-08-18 10:49:51 +08:00 via Android
    @Nagisa1992 php-fpm 不需要 PHP-CGI
    Zzzzzzzzz
        7
    Zzzzzzzzz  
       2017-08-18 11:31:12 +08:00
    @Nagisa1992 自己, 很传统的主进程调度, 子进程执行
    gouchaoer
        8
    gouchaoer  
       2017-08-18 11:37:33 +08:00
    @torbrowserbridge 的确如此,我搞错了,我一直以后 php-fpm 内部会去调用名为 php-cgi 的解释器
    Nagisa1992
        9
    Nagisa1992  
    OP
       2017-08-18 11:48:09 +08:00
    @torbrowserbridge 是说 php-fpm 自己就可以当解释器吗?
    ninerec
        10
    ninerec  
       2017-08-18 12:10:17 +08:00
    基于电脑上的 php7.0 说下。
    执行 php-cgi -v,可以看到,所谓 php-cgi,其实就是 fpm-fcgi,或者说 cgi-fcgi,是 fastcgi。
    然后 PHP-FPM 如大家所知,就是 FastCGI 的进程管理器,管理的就是 FastCGI 进程。

    然后你在电脑上 ps & grep 看下进程,确实会有 php-fpm 的 Master/Worker 进程,php-cgi 进程,各司其职。
    hheedat
        11
    hheedat  
       2017-08-18 12:45:15 +08:00
    @ninerec 没有 php-cgi 进程啊
    ninerec
        12
    ninerec  
       2017-08-18 14:25:28 +08:00   ❤️ 1
    @hheedat 抱歉,回答得不太仔细,也并不准确。看的机器是公司的,配置上可能不太通用,貌似也有些魔改的地方。
    可以先参考下这篇文章: https://segmentfault.com/a/1190000009863108
    我自己也得好好理解下 :sad:
    jsjscool
        13
    jsjscool  
       2017-08-18 14:26:03 +08:00   ❤️ 1
    cgi 是一种协议,用 C 语言写 web 就是通过实现 cgi 协议的方式。fast cgi 是一种更高级的 cgi 协议,php-fpm 和 php-cgi 都是实现了 fast-cgi 协议的应用程序。你的服务器可以选择使用 php-cgi( 启动命令` php-cgi -b 127.0.0.1:9000`) ,也可以选择使用 php-fpm(启动命令`php-fpm -D`),甚至两个一起用都可以(端口不能用一个)。所以 php-cgi 和 php-fpm 其实就像 QQ 和微信一样,都是腾讯的 IM,只不过微信体验更好一些。
    wbswjc
        14
    wbswjc  
       2017-08-18 16:56:34 +08:00
    hheedat
        15
    hheedat  
       2017-08-18 23:14:47 +08:00
    @jsjscool
    @ninerec
    多谢!
    julyclyde
        16
    julyclyde  
       2017-08-21 19:00:36 +08:00
    php-cgi、php-fpm、php-cli 等,分别是一种 SAPI
    至于 SAPI 是什么,你可以去看 php 的文档
    xiebruce
        17
    xiebruce  
       2018-11-08 12:19:24 +08:00
    @gouchaoer php-cli 应该不叫解释器吧?真正的解释器是 php,也就是这个: https://i.loli.net/2018/11/08/5be3b8dbea650.png ,而 php-cgi 只是用于接收 web 服务器的请求,并处理其中的一些参数什么的把它处理成 php 能理解的,然后 php-cgi 调用 php 来解析,解析完再返回的 web 服务器,不知道这样理解对不?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3618 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 00:48 · PVG 08:48 · LAX 16:48 · JFK 19:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.