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

2017-08-18 09:57:01 +08:00
 Nagisa1992
我之前一直理解是 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 这篇文章下面的评论第二页
4789 次点击
所在节点    PHP
17 条回复
gouchaoer
2017-08-18 10:08:36 +08:00
php-cgi 是 php-fpm 中使用的 php 解释器,对应 php 为 php-cli 的解释器,二者默认加载扩展不太一样。。。你在一台安装 php 的机器上试试就知道了
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
2017-08-18 10:44:54 +08:00
@gouchaoer 明白了,原来是有两个解释器啊。那意思是现在的 php 虽然用的是 php-fpm 管理和解释,但 fpm 内部调用的还是 php-cgi 对吗?
Nagisa1992
2017-08-18 10:46:33 +08:00
@Zzzzzzzzz 那成了独立模块之后 php-fpm 管理和调度的到底是什么呢?
torbrowserbridge
2017-08-18 10:47:57 +08:00
@Nagisa1992 不对,
torbrowserbridge
2017-08-18 10:49:51 +08:00
@Nagisa1992 php-fpm 不需要 PHP-CGI
Zzzzzzzzz
2017-08-18 11:31:12 +08:00
@Nagisa1992 自己, 很传统的主进程调度, 子进程执行
gouchaoer
2017-08-18 11:37:33 +08:00
@torbrowserbridge 的确如此,我搞错了,我一直以后 php-fpm 内部会去调用名为 php-cgi 的解释器
Nagisa1992
2017-08-18 11:48:09 +08:00
@torbrowserbridge 是说 php-fpm 自己就可以当解释器吗?
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
2017-08-18 12:45:15 +08:00
@ninerec 没有 php-cgi 进程啊
ninerec
2017-08-18 14:25:28 +08:00
@hheedat 抱歉,回答得不太仔细,也并不准确。看的机器是公司的,配置上可能不太通用,貌似也有些魔改的地方。
可以先参考下这篇文章: https://segmentfault.com/a/1190000009863108
我自己也得好好理解下 :sad:
jsjscool
2017-08-18 14:26:03 +08:00
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
2017-08-18 16:56:34 +08:00
hheedat
2017-08-18 23:14:47 +08:00
@jsjscool
@ninerec
多谢!
julyclyde
2017-08-21 19:00:36 +08:00
php-cgi、php-fpm、php-cli 等,分别是一种 SAPI
至于 SAPI 是什么,你可以去看 php 的文档
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 服务器,不知道这样理解对不?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/383875

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX